Skip to content

Commit

Permalink
Attempt to recover from syntax errors with bison
Browse files Browse the repository at this point in the history
Fixes gbdev#595
  • Loading branch information
Rangi42 committed Jan 21, 2021
1 parent 41d544a commit 6c1f173
Show file tree
Hide file tree
Showing 10 changed files with 72 additions and 4 deletions.
1 change: 1 addition & 0 deletions include/asm/fstack.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ void fstk_RunMacro(char const *macroName, struct MacroArgs *args);
void fstk_RunRept(uint32_t count, int32_t nReptLineNo, char *body, size_t size);
void fstk_RunFor(char const *symName, int32_t start, int32_t stop, int32_t step,
int32_t reptLineNo, char *body, size_t size);
void fstk_StopRept(void);
bool fstk_Break(void);

void fstk_Init(char const *mainPath, size_t maxRecursionDepth);
Expand Down
9 changes: 7 additions & 2 deletions src/asm/fstack.c
Original file line number Diff line number Diff line change
Expand Up @@ -501,6 +501,12 @@ void fstk_RunFor(char const *symName, int32_t start, int32_t stop, int32_t step,
fatalerror("Not enough memory for FOR symbol name: %s\n", strerror(errno));
}

void fstk_StopRept(void)
{
/* Prevent more iterations */
contextStack->nbReptIters = 0;
}

bool fstk_Break(void)
{
dbgPrint("Breaking out of REPT/FOR\n");
Expand All @@ -510,8 +516,7 @@ bool fstk_Break(void)
return false;
}

/* Prevent more iterations */
contextStack->nbReptIters = 0;
fstk_StopRept();
return true;
}

Expand Down
3 changes: 3 additions & 0 deletions src/asm/parser.y
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,9 @@ line : label T_NEWLINE
| label directive T_NEWLINE
| assignment_directive T_NEWLINE
| line_directive /* Directives that manage newlines themselves */
| error T_NEWLINE { /* Continue parsing the next line on a syntax error */
fstk_StopRept();
}
;

/*
Expand Down
11 changes: 11 additions & 0 deletions test/asm/error-recovery.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
println "begin"

println 42, 1 2 3 4

for n, 5
println "start {d:n}"
println syntax error
println "finish {d:n}"
endr

println "end {d:n}"
5 changes: 5 additions & 0 deletions test/asm/error-recovery.err
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
ERROR: error-recovery.asm(3):
syntax error, unexpected number
ERROR: error-recovery.asm(5) -> error-recovery.asm::REPT~1(7):
syntax error, unexpected identifier
error: Assembly aborted (2 errors)!
4 changes: 4 additions & 0 deletions test/asm/error-recovery.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
begin
$2Astart 0
finish 0
end 0
5 changes: 5 additions & 0 deletions test/asm/error-recovery.simple.err
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
ERROR: error-recovery.asm(3):
syntax error
ERROR: error-recovery.asm(5) -> error-recovery.asm::REPT~1(7):
syntax error
error: Assembly aborted (2 errors)!
17 changes: 16 additions & 1 deletion test/asm/label-macro-arg.err
Original file line number Diff line number Diff line change
@@ -1,4 +1,19 @@
ERROR: label-macro-arg.asm(38) -> label-macro-arg.asm::test_char(25):
syntax error, unexpected =
while expanding symbol "VAR_DEF"
error: Assembly aborted (1 errors)!
ERROR: label-macro-arg.asm(38) -> label-macro-arg.asm::test_char(29):
Interpolated symbol "sizeof_.something" does not exist
ERROR: label-macro-arg.asm(39) -> label-macro-arg.asm::test_char(25):
Label "sizeof_" created outside of a SECTION
while expanding symbol "VAR_DEF"
ERROR: label-macro-arg.asm(39) -> label-macro-arg.asm::test_char(25):
Macro "something" not defined
ERROR: label-macro-arg.asm(39) -> label-macro-arg.asm::test_char(26):
'sizeof_' already defined at label-macro-arg.asm(39) -> label-macro-arg.asm::test_char(25)
ERROR: label-macro-arg.asm(39) -> label-macro-arg.asm::test_char(26):
Macro "something" not defined
ERROR: label-macro-arg.asm(39) -> label-macro-arg.asm::test_char(29):
Invalid format spec 'sizeof_'
ERROR: label-macro-arg.asm(39) -> label-macro-arg.asm::test_char(29):
Interpolated symbol "something" does not exist
error: Assembly aborted (8 errors)!
2 changes: 2 additions & 0 deletions test/asm/label-macro-arg.out
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ $8
sizeof__something equals $1
sizeof_@something equals $1
sizeof_#something equals $1
sizeof_.something equals
sizeof_:something equals
19 changes: 18 additions & 1 deletion test/asm/label-macro-arg.simple.err
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,21 @@ while expanding symbol "VAR_DEF"
ERROR: label-macro-arg.asm(38) -> label-macro-arg.asm::test_char(25):
syntax error
while expanding symbol "VAR_DEF"
error: Assembly aborted (2 errors)!
ERROR: label-macro-arg.asm(38) -> label-macro-arg.asm::test_char(26):
Local label 'sizeof_.something' in main scope
ERROR: label-macro-arg.asm(38) -> label-macro-arg.asm::test_char(29):
Interpolated symbol "sizeof_.something" does not exist
ERROR: label-macro-arg.asm(39) -> label-macro-arg.asm::test_char(25):
Label "sizeof_" created outside of a SECTION
while expanding symbol "VAR_DEF"
ERROR: label-macro-arg.asm(39) -> label-macro-arg.asm::test_char(25):
Macro "something" not defined
ERROR: label-macro-arg.asm(39) -> label-macro-arg.asm::test_char(26):
'sizeof_' already defined at label-macro-arg.asm(39) -> label-macro-arg.asm::test_char(25)
ERROR: label-macro-arg.asm(39) -> label-macro-arg.asm::test_char(26):
Macro "something" not defined
ERROR: label-macro-arg.asm(39) -> label-macro-arg.asm::test_char(29):
Invalid format spec 'sizeof_'
ERROR: label-macro-arg.asm(39) -> label-macro-arg.asm::test_char(29):
Interpolated symbol "something" does not exist
error: Assembly aborted (10 errors)!

0 comments on commit 6c1f173

Please sign in to comment.