Fail for `else or `elsif after a matching `else

This commit is contained in:
Cary R 2021-01-26 19:51:55 -08:00
parent f8e82448be
commit 0cfbb8afeb
1 changed files with 35 additions and 20 deletions

View File

@ -201,12 +201,13 @@ static int ma_parenthesis_level = 0;
%x IFDEF_NAME
%x IFNDEF_NAME
%s IFDEF_TRUE
%x IFDEF_FALSE
%x IFDEF_SUPR
%x ELSIF_NAME
%x ELSIF_SUPR
%x IFDEF_FALSE
%s IFDEF_TRUE
%x IFDEF_SUPR
%s ELSE_TRUE
%x ELSE_SUPR
W [ \t\b\f]+
@ -214,7 +215,7 @@ W [ \t\b\f]+
* older versions of flex (at least 2.5.31); they are supposed to
* be implied, according to the flex manual.
*/
keywords (include|define|undef|ifdef|ifndef|else|elseif|endif)
keywords (include|define|undef|ifdef|ifndef|else|elsif|endif)
%%
@ -417,16 +418,16 @@ keywords (include|define|undef|ifdef|ifndef|else|elseif|endif)
yy_push_state(IFNDEF_NAME);
}
<IFDEF_FALSE,IFDEF_SUPR>`ifdef{W} |
<IFDEF_FALSE,IFDEF_SUPR>`ifndef{W} { ifdef_enter(); yy_push_state(IFDEF_SUPR); }
<IFDEF_FALSE,IFDEF_SUPR,ELSE_SUPR>`ifdef{W} |
<IFDEF_FALSE,IFDEF_SUPR,ELSE_SUPR>`ifndef{W} { ifdef_enter(); yy_push_state(IFDEF_SUPR); }
<IFDEF_TRUE>`elsif{W} { prev_state = YYSTATE; BEGIN(ELSIF_SUPR); }
<IFDEF_FALSE>`elsif{W} { prev_state = YYSTATE; BEGIN(ELSIF_NAME); }
<IFDEF_TRUE>`elsif{W} |
<IFDEF_SUPR>`elsif{W} { prev_state = YYSTATE; BEGIN(ELSIF_SUPR); }
<IFDEF_FALSE>`elsif{W} { prev_state = YYSTATE; BEGIN(ELSIF_NAME); }
<IFDEF_TRUE>`else { BEGIN(IFDEF_SUPR); }
<IFDEF_FALSE>`else { BEGIN(IFDEF_TRUE); }
<IFDEF_SUPR>`else {}
<IFDEF_TRUE>`else |
<IFDEF_SUPR>`else { BEGIN(ELSE_SUPR); }
<IFDEF_FALSE>`else { BEGIN(ELSE_TRUE); }
<IFDEF_NAME>[a-zA-Z_][a-zA-Z0-9_$]* {
if (is_defined(yytext))
@ -453,9 +454,9 @@ keywords (include|define|undef|ifdef|ifndef|else|elseif|endif)
BEGIN(IFDEF_SUPR);
}
<IFDEF_FALSE,IFDEF_SUPR>"//"[^\r\n]* {}
<IFDEF_FALSE,IFDEF_SUPR,ELSE_SUPR>"//"[^\r\n]* {}
<IFDEF_FALSE,IFDEF_SUPR>"/*" { comment_enter = YY_START; BEGIN(IFCCOMMENT); }
<IFDEF_FALSE,IFDEF_SUPR,ELSE_SUPR>"/*" { comment_enter = YY_START; BEGIN(IFCCOMMENT); }
<IFCCOMMENT>[^\r\n] {}
<IFCCOMMENT>\n\r |
@ -464,13 +465,13 @@ keywords (include|define|undef|ifdef|ifndef|else|elseif|endif)
<IFCCOMMENT>\r { istack->lineno += 1; fputc('\n', yyout); }
<IFCCOMMENT>"*/" { BEGIN(comment_enter); }
<IFDEF_FALSE,IFDEF_SUPR>[^\r\n] { }
<IFDEF_FALSE,IFDEF_SUPR>\n\r |
<IFDEF_FALSE,IFDEF_SUPR>\r\n |
<IFDEF_FALSE,IFDEF_SUPR>\n |
<IFDEF_FALSE,IFDEF_SUPR>\r { istack->lineno += 1; fputc('\n', yyout); }
<IFDEF_FALSE,IFDEF_SUPR,ELSE_SUPR>[^\r\n] { }
<IFDEF_FALSE,IFDEF_SUPR,ELSE_SUPR>\n\r |
<IFDEF_FALSE,IFDEF_SUPR,ELSE_SUPR>\r\n |
<IFDEF_FALSE,IFDEF_SUPR,ELSE_SUPR>\n |
<IFDEF_FALSE,IFDEF_SUPR,ELSE_SUPR>\r { istack->lineno += 1; fputc('\n', yyout); }
<IFDEF_FALSE,IFDEF_TRUE,IFDEF_SUPR>`endif { ifdef_leave(); yy_pop_state(); }
<IFDEF_FALSE,IFDEF_TRUE,IFDEF_SUPR,ELSE_TRUE,ELSE_SUPR>`endif { ifdef_leave(); yy_pop_state(); }
<IFDEF_NAME>(\n|\r) |
<IFDEF_NAME>. |
@ -510,6 +511,20 @@ keywords (include|define|undef|ifdef|ifndef|else|elseif|endif)
}
}
<ELSE_TRUE,ELSE_SUPR>`elsif{W}[a-zA-Z_][a-zA-Z0-9_$]* {
emit_pathline(istack);
fprintf(stderr, "error: `elsif after a matching `else.\n");
error_count += 1;
BEGIN(ELSE_SUPR);
}
<ELSE_TRUE,ELSE_SUPR>`else {
emit_pathline(istack);
fprintf(stderr, "error: `else after a matching `else.\n");
error_count += 1;
BEGIN(ELSE_SUPR);
}
<INITIAL>`elsif{W}[a-zA-Z_][a-zA-Z0-9_$]* {
emit_pathline(istack);
fprintf(stderr, "error: `elsif without a matching `ifdef.\n");