diff --git a/src/asm/parser.y b/src/asm/parser.y index d435ff5b..fe69ab4b 100644 --- a/src/asm/parser.y +++ b/src/asm/parser.y @@ -684,11 +684,19 @@ plain_directive : label line : plain_directive endofline | line_directive /* Directives that manage newlines themselves */ - | error endofline { /* Continue parsing the next line on a syntax error */ + /* Continue parsing the next line on a syntax error */ + | error { + lexer_SetMode(LEXER_NORMAL); + lexer_ToggleStringExpansion(true); + } endofline { fstk_StopRept(); yyerrok; } - | T_LABEL error endofline { /* Hint about unindented macros parsed as labels */ + /* Hint about unindented macros parsed as labels */ + | T_LABEL error { + lexer_SetMode(LEXER_NORMAL); + lexer_ToggleStringExpansion(true); + } endofline { struct Symbol *macro = sym_FindExactSymbol($1); if (macro && macro->type == SYM_MACRO) diff --git a/test/asm/syntax-error-lexer-mode.asm b/test/asm/syntax-error-lexer-mode.asm new file mode 100644 index 00000000..16af9a3c --- /dev/null +++ b/test/asm/syntax-error-lexer-mode.asm @@ -0,0 +1,12 @@ +newline equs "\n" + +def x = 1 newline def y = 2 +println "x={d:x}, y={d:y}" + +; the lexer is already in normal mode at the `AF`, so `newline` gets expanded +def m = AF newline def n = 2 +println "n={d:n}" + +; the lexer is in raw mode at the `AF`, but the parser resets it to normal +def AF = 1 newline def q = 2 +println "q={d:q}" diff --git a/test/asm/syntax-error-lexer-mode.err b/test/asm/syntax-error-lexer-mode.err new file mode 100644 index 00000000..9b9c1233 --- /dev/null +++ b/test/asm/syntax-error-lexer-mode.err @@ -0,0 +1,5 @@ +ERROR: syntax-error-lexer-mode.asm(7): + syntax error, unexpected af +ERROR: syntax-error-lexer-mode.asm(11): + syntax error, unexpected af, expecting identifier +error: Assembly aborted (2 errors)! diff --git a/test/asm/syntax-error-lexer-mode.out b/test/asm/syntax-error-lexer-mode.out new file mode 100644 index 00000000..61bfd3a2 --- /dev/null +++ b/test/asm/syntax-error-lexer-mode.out @@ -0,0 +1,3 @@ +x=1, y=2 +n=2 +q=2