diff --git a/parser/parser.lex b/parser/parser.lex index 15c486a..9ea6d71 100644 --- a/parser/parser.lex +++ b/parser/parser.lex @@ -4,14 +4,20 @@ %{ +#include + #include "nodes.h" #include "parser.h" #include "parser.tab.hh" #define YY_USER_ACTION yylloc->first_column += yyleng; +static std::string build_string; + %} +%x str + %% \+ return PLUS; @@ -36,8 +42,6 @@ \? return QUESTION; \$ return DOLLAR; \. return DOT; -\" return DQUOTE; -\' return SQUOTE; , return COMMA; \{ return LCURLY; @@ -119,6 +123,33 @@ local return LOCAL; } [ \t\v] /* ignore whitespace */ + /* strings */ +\" build_string = ""; BEGIN(str); + +{ + +\" { + /* end of the string literal */ + BEGIN(INITIAL); + *yylval = new IdentifierNode(build_string); + return STRING; +} +\\x[0-9A-Fa-f]{2} { + /* hexadecimal escape code */ + unsigned int val; + (void) sscanf(yytext + 2, "%x", &val); + build_string += (char) val; +} +\\n build_string += '\n'; +\\t build_string += '\t'; +\\r build_string += '\r'; +\\b build_string += '\b'; +\\f build_string += '\f'; +\\(.|\n) build_string += yytext[1]; +[^\\\"]+ build_string += yytext; + +} + . return yytext[0]; %% diff --git a/parser/parser.yy b/parser/parser.yy index f824953..573dfed 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -55,8 +55,6 @@ refptr parser_scope; %token QUESTION; %token DOLLAR; %token DOT; -%token DQUOTE; -%token SQUOTE; %token COMMA; %token LCURLY; @@ -67,6 +65,7 @@ refptr parser_scope; %token RPAREN; %token REAL_NUMBER; +%token STRING; %token AMBIENT; %token AMBIENT_OCCLUSION;