Correctly recover from syntax errors at the first token of a line (#1549)

This commit is contained in:
Sylvie
2024-10-22 15:01:44 -04:00
committed by GitHub
parent f048cbbb11
commit 7fcf4ba60f
5 changed files with 16 additions and 11 deletions

View File

@@ -404,6 +404,14 @@ asm_file: lines;
lines:
%empty
| lines diff_mark line
// Continue parsing the next line on a syntax error
| error {
lexer_SetMode(LEXER_NORMAL);
lexer_ToggleStringExpansion(true);
} endofline {
fstk_StopRept();
yyerrok;
}
;
diff_mark:
@@ -425,14 +433,6 @@ diff_mark:
line:
plain_directive endofline
| line_directive // Directives that manage newlines themselves
// Continue parsing the next line on a syntax error
| error {
lexer_SetMode(LEXER_NORMAL);
lexer_ToggleStringExpansion(true);
} endofline {
fstk_StopRept();
yyerrok;
}
;
endofline: NEWLINE | EOB;

View File

@@ -6,4 +6,6 @@ error: macro-syntax.asm(8):
'\1' cannot be used outside of a macro
error: macro-syntax.asm(9):
syntax error, unexpected ENDM
error: Assembly aborted (4 errors)!
error: macro-syntax.asm(11):
"old" is not a macro
error: Assembly aborted (5 errors)!

View File

@@ -28,4 +28,4 @@ ENDM
mac2 elif, 6 * 7 ; this prints "it's $2A" because it skips the `\1` line and takes the `else`
mac2 elif, 6 * 9
mac2 elif
mac2
mac2 ; this prints "args:" *and* "forty-two!" since it doesn't create an `elif`

View File

@@ -2,4 +2,6 @@ error: skip-expansions.asm(31) -> skip-expansions.asm::mac2(21):
Macro argument '\1' not defined
error: skip-expansions.asm(31) -> skip-expansions.asm::mac2(21):
syntax error, unexpected (
error: Assembly aborted (2 errors)!
error: skip-expansions.asm(31) -> skip-expansions.asm::mac2(21):
Macro argument '\2' not defined
error: Assembly aborted (3 errors)!

View File

@@ -6,3 +6,4 @@ it's $2A
it's $36
args: elif
args:
forty-two!