Disallow labels before ENDC

This commit is contained in:
Rangi42
2025-10-31 18:21:59 -04:00
parent df5162edca
commit 558d3ca0fc
5 changed files with 24 additions and 8 deletions

View File

@@ -455,12 +455,13 @@ endofline: NEWLINE | EOB | EOL;
// and to avoid causing some grammar conflicts (token reducing is finicky). // and to avoid causing some grammar conflicts (token reducing is finicky).
// This is DEFINITELY one of the more FRAGILE parts of the codebase, handle with care. // This is DEFINITELY one of the more FRAGILE parts of the codebase, handle with care.
line_directive: line_directive:
def_macro macro_def
| rept | rept
| for | for
| break | break
| include | include
| if | if
| endc
// It's important that all of these require being at line start for `skipIfBlock` // It's important that all of these require being at line start for `skipIfBlock`
| elif | elif
| else | else
@@ -489,12 +490,12 @@ else:
plain_directive: plain_directive:
label label
| label data | label data
| label macro | label macro_invocation
| label directive | label directive
; ;
endc: endc:
POP_ENDC { POP_ENDC endofline {
act_Endc(); act_Endc();
} }
; ;
@@ -545,7 +546,7 @@ label:
} }
; ;
macro: macro_invocation:
SYMBOL { SYMBOL {
// Parsing 'macro_args' will restore the lexer's normal mode // Parsing 'macro_args' will restore the lexer's normal mode
lexer_SetMode(LEXER_RAW); lexer_SetMode(LEXER_RAW);
@@ -571,8 +572,7 @@ macro_args:
; ;
directive: directive:
endc print
| print
| println | println
| export | export
| export_def | export_def
@@ -853,7 +853,7 @@ break:
} }
; ;
def_macro: macro_def:
POP_MACRO { POP_MACRO {
lexer_ToggleStringExpansion(false); lexer_ToggleStringExpansion(false);
} maybe_quiet SYMBOL { } maybe_quiet SYMBOL {

View File

@@ -12,4 +12,5 @@ error: syntax error, unexpected PRINTLN, expecting end of line
at code-after-endm-endr-endc.asm(23) at code-after-endm-endr-endc.asm(23)
error: syntax error, unexpected PRINTLN, expecting end of line or end of buffer or end of fragment literal error: syntax error, unexpected PRINTLN, expecting end of line or end of buffer or end of fragment literal
at code-after-endm-endr-endc.asm(25) at code-after-endm-endr-endc.asm(25)
Assembly aborted with 7 errors! FATAL: Ended block with 2 unterminated conditionals (`IF`/`ELIF`/`ELSE` blocks)
at code-after-endm-endr-endc.asm(28)

View File

@@ -0,0 +1,7 @@
section "test", rom0
if 1
println "one"
label0: endc
if 2
println "two"
label1: endc

View File

@@ -0,0 +1,6 @@
error: syntax error, unexpected ENDC
at label-before-endc.asm(4)
error: syntax error, unexpected ENDC
at label-before-endc.asm(7)
FATAL: Ended block with 2 unterminated conditionals (`IF`/`ELIF`/`ELSE` blocks)
at label-before-endc.asm(8)

View File

@@ -0,0 +1,2 @@
one
two