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>
This commit is contained in:
2026-07-31 11:46:10 -04:00
parent 0f3d8a0ac6
commit a31058cf37
8 changed files with 256 additions and 18 deletions

View File

@@ -0,0 +1,17 @@
10 REM Statements separated by colons. The COLON token existed from the start of
20 REM the port and nothing consumed it, so a line could hold only one statement.
30 PRINT "A" : PRINT "B"
40 A# = 1 : B# = 2 : PRINT A# + B#
50 REM An empty statement is not an error: a trailing separator, or a run of them.
60 PRINT "C" :
70 PRINT "D" :: PRINT "E"
80 REM Everything after THEN belongs to the condition, which is BASIC 7.0 and is
90 REM not something the reference had an opinion about -- it never got here.
100 IF 1 == 1 THEN PRINT "TRUE-1" : PRINT "TRUE-2"
110 IF 1 == 0 THEN PRINT "NEVER-1" : PRINT "NEVER-2"
120 REM With an ELSE, the tail belongs to the ELSE instead.
130 IF 1 == 1 THEN PRINT "T" ELSE PRINT "E" : PRINT "E-TAIL"
140 IF 1 == 0 THEN PRINT "T" ELSE PRINT "E" : PRINT "E-TAIL"
150 REM A colon does not confuse a bare verb that takes no argument.
160 PRINT : PRINT "AFTER A BARE PRINT"
170 PRINT "DONE"

View File

@@ -0,0 +1,14 @@
A
B
3
C
D
E
TRUE-1
TRUE-2
T
E
E-TAIL
AFTER A BARE PRINT
DONE