From 80a376f045aaf06d705221886b30251137312c71 Mon Sep 17 00:00:00 2001 From: Rangi Date: Sat, 22 May 2021 16:08:55 -0400 Subject: [PATCH] Syntax errors resets the lexer right away `DEF`, `REDEF`, etc disable EQUS expansion, and reading macro or OPT arguments sets the lexer to raw mode. Syntax errors resume normal parsing at the line's end, but should resume normal tokenization even before that. --- src/asm/parser.y | 12 ++++++++++-- test/asm/syntax-error-lexer-mode.asm | 12 ++++++++++++ test/asm/syntax-error-lexer-mode.err | 5 +++++ test/asm/syntax-error-lexer-mode.out | 3 +++ 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 test/asm/syntax-error-lexer-mode.asm create mode 100644 test/asm/syntax-error-lexer-mode.err create mode 100644 test/asm/syntax-error-lexer-mode.out 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