diff --git a/src/parser/parser.l b/src/parser/parser.l index 0e4325f..2a1f43a 100644 --- a/src/parser/parser.l +++ b/src/parser/parser.l @@ -5,9 +5,12 @@ #include "parser.h" #include "parser.tab.h" +#include "String.h" #define YY_USER_ACTION yylloc->first_column += yyleng; +static String * build_string = NULL; + %} %x str @@ -97,21 +100,30 @@ sizeof return TOK_SIZEOF; 0[xX][0-9a-fA-F]+([uU][lL]?[lL]?)? return TOK_INT_CONST; [0-9]*\.[0-9]*[fF]? return TOK_FLOAT_CONST; -\" BEGIN(str); +\" { + if (build_string != NULL) + { + String_free(build_string); + } + build_string = String_new(""); + BEGIN(str); +} { \" return TOK_STR_CONST; \\x[0-9A-Fa-f]{2} { /* hexadecimal escape code */ unsigned int val; (void) sscanf(yytext + 2, "%x", &val); + char v[2] = {(char)val, '\0'}; + String_concat(build_string, v); } -\\n (void)'\n'; -\\t (void)'\t'; -\\r (void)'\r'; -\\b (void)'\b'; -\\f (void)'\f'; -\\. (void)yytext[1]; -[^\\\"]+ (void)yytext; +\\n String_concat(build_string, "\n"); +\\t String_concat(build_string, "\t"); +\\r String_concat(build_string, "\r"); +\\b String_concat(build_string, "\b"); +\\f String_concat(build_string, "\f"); +\\. String_concat(build_string, &yytext[1]); +[^\\\"]+ String_concat(build_string, yytext); } [a-zA-Z_][a-zA-Z_0-9]* return TOK_IDENTIFIER;