simplify handling of extra '}'

This commit is contained in:
Guillaume Maudoux 2016-06-14 17:42:46 +02:00 committed by Guillaume Maudoux
parent f6a3dfe4e0
commit 6a5bf9b143

View file

@ -6,9 +6,9 @@
%option nounput noyy_top_state %option nounput noyy_top_state
%s DEFAULT
%x STRING %x STRING
%x IND_STRING %x IND_STRING
%x INSIDE_DOLLAR_CURLY
%{ %{
@ -99,8 +99,6 @@ URI [a-zA-Z][a-zA-Z0-9\+\-\.]*\:[a-zA-Z0-9\%\/\?\:\@\&\=\+\$\,\-\_\.\!\~
%% %%
<INITIAL,INSIDE_DOLLAR_CURLY>{
if { return IF; } if { return IF; }
then { return THEN; } then { return THEN; }
@ -140,17 +138,19 @@ or { return OR_KW; }
return FLOAT; return FLOAT;
} }
\$\{ { PUSH_STATE(INSIDE_DOLLAR_CURLY); return DOLLAR_CURLY; } \$\{ { PUSH_STATE(DEFAULT); return DOLLAR_CURLY; }
}
\} { return '}'; } \} { /* State INITIAL only exists at the bottom of the stack and is
<INSIDE_DOLLAR_CURLY>\} { POP_STATE(); return '}'; } used as a marker. DEFAULT replaces it everywhere else.
\{ { return '{'; } Popping when in INITIAL state causes an empty stack exception,
<INSIDE_DOLLAR_CURLY>\{ { PUSH_STATE(INSIDE_DOLLAR_CURLY); return '{'; } so don't */
if (YYSTATE != INITIAL)
POP_STATE();
return '}';
}
\{ { PUSH_STATE(DEFAULT); return '{'; }
<INITIAL,INSIDE_DOLLAR_CURLY>\" { \" { PUSH_STATE(STRING); return '"'; }
PUSH_STATE(STRING); return '"';
}
<STRING>([^\$\"\\]|\$[^\{\"\\]|\\{ANY}|\$\\{ANY})*\$/\" | <STRING>([^\$\"\\]|\$[^\{\"\\]|\\{ANY}|\$\\{ANY})*\$/\" |
<STRING>([^\$\"\\]|\$[^\{\"\\]|\\{ANY}|\$\\{ANY})+ { <STRING>([^\$\"\\]|\$[^\{\"\\]|\\{ANY}|\$\\{ANY})+ {
/* It is impossible to match strings ending with '$' with one /* It is impossible to match strings ending with '$' with one
@ -159,7 +159,7 @@ or { return OR_KW; }
yylval->e = unescapeStr(data->symbols, yytext, yyleng); yylval->e = unescapeStr(data->symbols, yytext, yyleng);
return STR; return STR;
} }
<STRING>\$\{ { PUSH_STATE(INSIDE_DOLLAR_CURLY); return DOLLAR_CURLY; } <STRING>\$\{ { PUSH_STATE(DEFAULT); return DOLLAR_CURLY; }
<STRING>\" { POP_STATE(); return '"'; } <STRING>\" { POP_STATE(); return '"'; }
<STRING>\$|\\|\$\\ { <STRING>\$|\\|\$\\ {
/* This can only occur when we reach EOF, otherwise the above /* This can only occur when we reach EOF, otherwise the above
@ -169,7 +169,7 @@ or { return OR_KW; }
return STR; return STR;
} }
<INITIAL,INSIDE_DOLLAR_CURLY>\'\'(\ *\n)? { PUSH_STATE(IND_STRING); return IND_STRING_OPEN; } \'\'(\ *\n)? { PUSH_STATE(IND_STRING); return IND_STRING_OPEN; }
<IND_STRING>([^\$\']|\$[^\{\']|\'[^\'\$])+ { <IND_STRING>([^\$\']|\$[^\{\']|\'[^\'\$])+ {
yylval->e = new ExprIndStr(yytext); yylval->e = new ExprIndStr(yytext);
return IND_STR; return IND_STR;
@ -187,14 +187,13 @@ or { return OR_KW; }
yylval->e = unescapeStr(data->symbols, yytext + 2, yyleng - 2); yylval->e = unescapeStr(data->symbols, yytext + 2, yyleng - 2);
return IND_STR; return IND_STR;
} }
<IND_STRING>\$\{ { PUSH_STATE(INSIDE_DOLLAR_CURLY); return DOLLAR_CURLY; } <IND_STRING>\$\{ { PUSH_STATE(DEFAULT); return DOLLAR_CURLY; }
<IND_STRING>\'\' { POP_STATE(); return IND_STRING_CLOSE; } <IND_STRING>\'\' { POP_STATE(); return IND_STRING_CLOSE; }
<IND_STRING>\' { <IND_STRING>\' {
yylval->e = new ExprIndStr("'"); yylval->e = new ExprIndStr("'");
return IND_STR; return IND_STR;
} }
<INITIAL,INSIDE_DOLLAR_CURLY>{
{PATH} { if (yytext[yyleng-1] == '/') {PATH} { if (yytext[yyleng-1] == '/')
throw ParseError("path '%s' has a trailing slash", yytext); throw ParseError("path '%s' has a trailing slash", yytext);
@ -219,7 +218,5 @@ or { return OR_KW; }
return (unsigned char) yytext[0]; return (unsigned char) yytext[0];
} }
}
%% %%