Consume the COLON token: a line can hold several statements
The token has existed since the scanner was written and nothing read it, so 10 PRINT A$ : REM ... was a parse error. Leading separators are consumed before each statement and an empty statement yields a NULL leaf rather than an error, so a trailing colon and a run of them are both legal. BASIC 7.0 scopes everything after THEN to the condition, which the reference had no opinion about because it never got here. The rule is not "skip when false": the rest of the line belongs to whichever arm was written last. A whole FOR/NEXT on one line still does not loop -- block skipping works by source line. Recorded in TODO.md as what group A has to fix first. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-Authored-By: Andrew Kesterson <andrew@aklabs.net>
This commit is contained in:
@@ -126,6 +126,19 @@ typedef struct akbasic_Runtime
|
||||
*/
|
||||
int64_t timems;
|
||||
|
||||
/*
|
||||
* Set by a branch that has decided the remaining statements on its line
|
||||
* belong to the arm it did not take, and cleared at the top of every line.
|
||||
*
|
||||
* This exists because a line can hold several statements and BASIC 7.0
|
||||
* scopes everything after THEN to the condition -- `IF C THEN A : B` runs
|
||||
* neither A nor B when C is false. The statement loop is what knows where a
|
||||
* line ends, so the branch raises a flag and the loop acts on it. See the
|
||||
* BRANCH case in akbasic_runtime_evaluate() for the exact rule, which is not
|
||||
* quite "skip when false".
|
||||
*/
|
||||
bool skiprestofline;
|
||||
|
||||
/* REPL line assembly */
|
||||
char userline[AKBASIC_MAX_LINE_LENGTH];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user