/* flex -o cparse_lex.c cparse_lex.l */ /* definitions */ %x sComment %x sID %x sValue %x sQStr %option noyywrap ID ([-[:alnum:]_]+) SPACE ([[:space:]]{-}[\n]) %{ #include #include "cparse_def.h" #include "cparse.h" #define STR_BUF_INC 4096 int line_number = 0; int node_deactivated = 0; char *str_buf = NULL; char *out_buf = NULL; char *str_ptr = NULL; size_t str_buf_len = 0; void append_str(char *text) { size_t tlen = strlen(text); size_t slen = str_ptr - str_buf; if (!str_buf || (slen + tlen) >= str_buf_len) { str_buf_len += STR_BUF_INC; str_buf = realloc(str_buf, str_buf_len); out_buf = realloc(out_buf, str_buf_len); if (!str_buf || !out_buf) { printf("realloc failed\n"); exit(1); } str_ptr = str_buf + slen; } strcpy(str_ptr, text); str_ptr += tlen; } void set_ret_str() { *str_ptr = 0; strcpy(out_buf, str_buf); str_ptr = str_buf; } %} %% "/*" { BEGIN(sComment); } [^*\n]* { append_str(yytext); } \*[^/] { append_str(yytext); } \n { append_str(yytext); ++line_number; } "*/" { set_ret_str(); yylval.str = strdup(out_buf); BEGIN(INITIAL); return COMMENT; } ! { node_deactivated = 1; } [[:space:]]+ { } \} { node_deactivated = 0; return RIGHTB; } {ID} { yylval.str = strdup(yytext); yylval.deactivated = node_deactivated; node_deactivated = 0; BEGIN(sID); return NODE; } :?{SPACE}+[^{\n] { unput(yytext[yyleng - 1]); BEGIN(sValue); } {SPACE}+ { } \{ { BEGIN(INITIAL); return LEFTB; } \n { ++line_number; BEGIN(INITIAL); } {SPACE}+ { /* ignore spaces */ } \" { /* quoted string */ BEGIN(sQStr); } [^\"\\\n]+ { append_str(yytext); } \\. { char tmp[2] = { yytext[1], 0 }; append_str(tmp); } \n { append_str(yytext); ++line_number; } \" { set_ret_str(); yylval.str = strdup(out_buf); BEGIN(sValue); return VALUE; } [^{"[:space:]][^{[:space:]]+ { /* unquoted string */ yylval.str = strdup(yytext); return VALUE; } \{ { BEGIN(INITIAL); return LEFTB; } \n { ++line_number; BEGIN(INITIAL); } %% /* code */