diff options
author | kintel <kintel@b57f626f-c46c-0410-a088-ec61d464b74c> | 2011-01-09 16:08:14 (GMT) |
---|---|---|
committer | kintel <kintel@b57f626f-c46c-0410-a088-ec61d464b74c> | 2011-01-09 16:08:14 (GMT) |
commit | ba8d663de2f8fa2a0c8ebb69ece99131bff01bee (patch) | |
tree | ba4880c8587a5282c3bffaebc90aa00173fa6efe | |
parent | 8bf2099ca0eeea4f94a1b75a66035cd28cd3fa7f (diff) |
Improvement to lexing of strings don't use QString.replace, use the power of flex instead.
git-svn-id: http://svn.clifford.at/openscad/trunk@582 b57f626f-c46c-0410-a088-ec61d464b74c
-rw-r--r-- | src/lexer.l | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/src/lexer.l b/src/lexer.l index b949169..86006d0 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -30,7 +30,7 @@ #include "parser_yacc.h" #include <QFileInfo> #include <QDir> - +QString* stringcontents; int lexerget_lineno(void); #ifdef __GNUC__ static void yyunput(int, char*) __attribute__((unused)); @@ -63,7 +63,7 @@ extern const char *parser_source_path; %option yylineno %option noyywrap -%x comment +%x comment string DIGIT [0-9] @@ -140,15 +140,19 @@ use[ \t\r\n>]*"<"[^ \t\r\n>]+">" { {DIGIT}+|{DIGIT}*\.{DIGIT}+|{DIGIT}+\.{DIGIT}* { parserlval.number = QString(yytext).toDouble(); return TOK_NUMBER; } "$"?[a-zA-Z0-9_]+ { parserlval.text = strdup(yytext); return TOK_ID; } -\"(\\[tnr\"\\]|[^\\"])*\" { QString str(yytext+1); - str.chop(1); - str=str.replace("\\\\","\\"); - str=str.replace("\\\"","\""); - str=str.replace("\\t","\t"); - str=str.replace("\\n","\n"); - str=str.replace("\\r","\r"); - parserlval.text = strdup(str.toAscii().data()); - return TOK_STRING; } +\" { BEGIN(string); stringcontents = new QString(); } +<string>{ +\\n { stringcontents->append('\n'); } +\\t { stringcontents->append('\t'); } +\\r { stringcontents->append('\r'); } +\\\\ { stringcontents->append('\\'); } +\\\" { stringcontents->append('"'); } +[^\\\n\"]+ { stringcontents->append(lexertext); } +\" { BEGIN(INITIAL); + parserlval.text = strdup(stringcontents->toLocal8Bit()); + delete stringcontents; + return TOK_STRING; } +} [\n\r\t ] \/\/[^\n]*\n? |