From bd7a1f4b4420fab84a50294916046d23b179f402 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Wed, 6 Mar 2019 13:57:29 +0100 Subject: [PATCH] Minor simplifications in the lexers In particular, no need to put both upper and lower case letters in the patterns, since the lexer is case-insensitive. The only simplification that we do not perform is removing the quoting of single quotes (i.e. replacing \' by '), since it confuses the C++ mode of Emacs. --- src/DynareFlex.ll | 73 +++++++++++++++++++++--------------------- src/macro/MacroFlex.ll | 30 ++++++++--------- 2 files changed, 51 insertions(+), 52 deletions(-) diff --git a/src/DynareFlex.ll b/src/DynareFlex.ll index 22b3f8c0..30cee961 100644 --- a/src/DynareFlex.ll +++ b/src/DynareFlex.ll @@ -71,7 +71,7 @@ string eofbuff; #define YY_USER_ACTION location_increment(yylloc, yytext); %} -DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2])) +DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4]|w([1-9]{1}|[1-4][0-9]|5[0-2])) %% /* Code put at the beginning of yylex() */ @@ -93,12 +93,11 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2 } /* spaces, tabs and carriage returns are ignored */ -[ \t\r\f]+ { yylloc->step(); } -[\n]+ { yylloc->step(); } +[[:space:]]+ { yylloc->step(); } /* Comments */ -["%"].* -["/"]["/"].* +%.* +"//".* "/*" {comment_caller = YY_START; BEGIN COMMENT;} "*/" {BEGIN comment_caller;} @@ -682,7 +681,7 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2 emas_max_iter {return token::EMAS_MAX_ITER; } variable {return token::VARIABLE;} -[\$][^$]*[\$] { +\$[^$]*\$ { strtok(yytext+1, "$"); yylval->build(yytext + 1); return token::TEX_NAME; @@ -771,9 +770,9 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2 variances {return token::VARIANCES;} equations {return token::EQUATIONS;} -[\.] {return Dynare::parser::token_type (yytext[0]);} -[\\] {return Dynare::parser::token_type (yytext[0]);} -[\'] {return Dynare::parser::token_type (yytext[0]);} +\. {return Dynare::parser::token_type (yytext[0]);} +\\ {return Dynare::parser::token_type (yytext[0]);} +\' {return Dynare::parser::token_type (yytext[0]);} use_dll {return token::USE_DLL;} block {return token::BLOCK;} @@ -786,27 +785,27 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2 linear {return token::LINEAR;} -[,] {return token::COMMA;} -[:] {return Dynare::parser::token_type (yytext[0]);} +, {return token::COMMA;} +: {return Dynare::parser::token_type (yytext[0]);} [\(\)] {return Dynare::parser::token_type (yytext[0]);} -[\[] {return Dynare::parser::token_type (yytext[0]);} -[\]] { +\[ {return Dynare::parser::token_type (yytext[0]);} +\] { if (sigma_e) sigma_e = 0; return Dynare::parser::token_type (yytext[0]); } -[+] {return token::PLUS;} -[-] {return token::MINUS;} -[*] {return token::TIMES;} -[/] {return token::DIVIDE;} -[=] {return token::EQUAL;} -[<] {return token::LESS;} -[>] {return token::GREATER;} -">=" {return token::GREATER_EQUAL;} -"<=" {return token::LESS_EQUAL;} -"==" {return token::EQUAL_EQUAL;} -"!=" {return token::EXCLAMATION_EQUAL;} -[\^] {return token::POWER;} +\+ {return token::PLUS;} +- {return token::MINUS;} +\* {return token::TIMES;} +\/ {return token::DIVIDE;} += {return token::EQUAL;} +< {return token::LESS;} +> {return token::GREATER;} +>= {return token::GREATER_EQUAL;} +<= {return token::LESS_EQUAL;} +== {return token::EQUAL_EQUAL;} +!= {return token::EXCLAMATION_EQUAL;} +\^ {return token::POWER;} exp {return token::EXP;} log {return token::LOG;} log10 {return token::LOG10;} @@ -883,12 +882,12 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2 use_shock_groups {return token::USE_SHOCK_GROUPS;} colormap {return token::COLORMAP;} -[A-Za-z_][A-Za-z0-9_]* { +[a-z_][a-z0-9_]* { yylval->build(yytext); return token::NAME; } -((([0-9]*\.[0-9]+)|([0-9]+\.))([edED][-+]?[0-9]+)?)|([0-9]+[edED][-+]?[0-9]+) { +((([0-9]*\.[0-9]+)|([0-9]+\.))([ed][-+]?[0-9]+)?)|([0-9]+[ed][-+]?[0-9]+) { yylval->build(yytext); return token::FLOAT_NUMBER; } @@ -909,9 +908,9 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2 } . { yylval->as().append(yytext); } -\|[eE] { return token::PIPE_E; } -\|[xX] { return token::PIPE_X; } -\|[pP] { return token::PIPE_P; } +\|e { return token::PIPE_E; } +\|x { return token::PIPE_X; } +\|p { return token::PIPE_P; } \'[^\']+\' { yylval->build(yytext + 1).pop_back(); @@ -946,7 +945,7 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2 element in initval (in which case Dynare recognizes the matrix name as an external function symbol), and may want to modify the matrix later with Matlab statements. */ -[A-Za-z_][A-Za-z0-9_]* { +[a-z_][a-z0-9_]* { if (driver.symbol_exists_and_is_not_modfile_local_or_external_function(yytext)) { BEGIN DYNARE_STATEMENT; @@ -964,7 +963,7 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2 /* For joint prior statement, match [symbol, symbol, ...] If no match, begin native and push everything back on stack */ -\[([[:space:]]*[A-Za-z_][A-Za-z0-9_]*[[:space:]]*,{1}[[:space:]]*)*([[:space:]]*[A-Za-z_][A-Za-z0-9_]*[[:space:]]*){1}\] { +\[([[:space:]]*[a-z_][a-z0-9_]*[[:space:]]*,{1}[[:space:]]*)*([[:space:]]*[a-z_][a-z0-9_]*[[:space:]]*){1}\] { string yytextcpy = string(yytext); yytextcpy.erase(remove(yytextcpy.begin(), yytextcpy.end(), '['), yytextcpy.end()); yytextcpy.erase(remove(yytextcpy.begin(), yytextcpy.end(), ']'), yytextcpy.end()); @@ -1003,8 +1002,8 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2 \'[^\'\n]*\' | \"[^\"\n]*\" | \.{1,2} | - "*" | - "/" { yymore(); eofbuff = string(yytext); } + \* | + \/ { yymore(); eofbuff = string(yytext); } \.{3,}[[:space:]]*\n { driver.add_native_remove_charset(yytext, "\n"); } \n { if (strlen(yytext) > 1) @@ -1015,10 +1014,10 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2 driver.add_native(eofbuff); yyterminate(); } - \.{3,}[[:space:]]*"%".*\n | - "%"[^\n]* { driver.add_native_remove_charset(yytext, "%"); } + \.{3,}[[:space:]]*%.*\n | + %[^\n]* { driver.add_native_remove_charset(yytext, "%"); } \.{3,}[[:space:]]*"//".*\n | - "//"[^\n]* { driver.add_native_remove_charset(yytext, "//"); } + "//"[^\n]* { driver.add_native_remove_charset(yytext, "//"); } \.{3,}[[:space:]]*"/*" { driver.add_native_remove_charset(yytext, "/*"); BEGIN NATIVE_COMMENT; diff --git a/src/macro/MacroFlex.ll b/src/macro/MacroFlex.ll index 776f48ca..46a49fd4 100644 --- a/src/macro/MacroFlex.ll +++ b/src/macro/MacroFlex.ll @@ -213,22 +213,22 @@ CONT \\\\ : { return token::COLON; } , { return token::COMMA; } = { return token::EQUAL; } -[!] { return token::EXCLAMATION; } +! { return token::EXCLAMATION; } "||" { return token::LOGICAL_OR; } && { return token::LOGICAL_AND; } -"|" { return token::UNION; } -"&" { return token::INTERSECTION; } -"^" { return token::POWER; } -"<=" { return token::LESS_EQUAL; } -">=" { return token::GREATER_EQUAL; } -"<" { return token::LESS; } -">" { return token::GREATER; } -"==" { return token::EQUAL_EQUAL; } -"!=" { return token::EXCLAMATION_EQUAL; } -[+] { return token::PLUS; } -[-] { return token::MINUS; } -[*] { return token::TIMES; } -[/] { return token::DIVIDE; } +\| { return token::UNION; } +& { return token::INTERSECTION; } +\^ { return token::POWER; } +<= { return token::LESS_EQUAL; } +>= { return token::GREATER_EQUAL; } +< { return token::LESS; } +> { return token::GREATER; } +== { return token::EQUAL_EQUAL; } +!= { return token::EXCLAMATION_EQUAL; } +\+ { return token::PLUS; } +- { return token::MINUS; } +\* { return token::TIMES; } +\/ { return token::DIVIDE; } in { return token::IN; } length { return token::LENGTH; } @@ -267,7 +267,7 @@ CONT \\\\ echo { return token::ECHO_DIR; } error { return token::ERROR; } -[A-Za-z_][A-Za-z0-9_]* { +[a-z_][a-z0-9_]* { yylval->build(yytext); return token::NAME; }