basic: fix: would crap out when 'REM' is not a first statement of a line

This commit is contained in:
minjaesong
2020-12-16 15:13:03 +09:00
parent e61fe9e0af
commit 9ca9990a19
6 changed files with 185 additions and 225 deletions

View File

@@ -690,7 +690,7 @@ if no arg text were given (e.g. "10 NEXT"), args will have zero length
});
},
"DIM" : function(lnum, stmtnum, args) {
return varArgNum(lnum, args, (revdims) => {
return varArgNum(lnum, stmtnum, args, (revdims) => {
let dims = revdims.reverse();
let arraydec = "Array(dims[0]).fill(0)";
for (let k = 1; k < dims.length; k++) {
@@ -1835,6 +1835,14 @@ bF._parseStmt = function(lnum, tokens, states, recDepth) {
/*************************************************************************/
// case for: single word (e.g. NEXT for FOR loop)
if (tokens.length == 1 && states.length == 1) {
bF.parserPrintdbgline('$', "Single Word Function Call", lnum, recDepth);
return bF._parseLit(lnum, tokens, states, recDepth + 1, true);
}
/*************************************************************************/
let headTkn = tokens[0].toUpperCase();
let headSta = states[0];
@@ -1843,11 +1851,8 @@ bF._parseStmt = function(lnum, tokens, states, recDepth) {
/*************************************************************************/
// case for: single word (e.g. NEXT for FOR loop)
if (tokens.length == 1 && states.length == 1) {
bF.parserPrintdbgline('$', "Single Word Function Call", lnum, recDepth);
return bF._parseLit(lnum, tokens, states, recDepth + 1, true);
}
// case for: "REM" , ? anything ?
if (headTkn == "REM" && headSta != "qot") return;
/*************************************************************************/
@@ -2773,11 +2778,13 @@ bF.run = function(args) { // RUN function
let trees = bF._interpretLine(linenum, linestr.trim());
programTrees[linenum] = trees
// do prescan job (data, label, etc)
trees.forEach((t, i) => {
if (bF.prescanStmts.includes(t.astValue)) {
bF._executeAndGet(linenum, i, t);
}
})
if (trees !== undefined) {
trees.forEach((t, i) => {
if (t !== undefined && bF.prescanStmts.includes(t.astValue)) {
bF._executeAndGet(linenum, i, t);
}
})
}
});
// actually execute the program

View File

@@ -1,35 +1,29 @@
1 OPTIONBASE 1
2 PRINT SPC(31);"BLACK JACK"
4 PRINT SPC(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
6 PRINT
7 PRINT
8 PRINT
20 HANDS=DIM(15,12)
21 HANDTOTAL=DIM(15)
22 DECK=DIM(52)
23 DISCARDECK=DIM(52)
24 PLRSUM=DIM(8)
25 PLRHNDSUM=DIM(7)
26 BETS=DIM(15)
30 HANDSLENS=DIM(15)
40 REM--HANDS(I,J) IS THE JTH CARD IN HAND I, HANDTOTAL(I) IS TOTAL OF HAND I
50 REM--C IS THE DECK BEING DEALT FROM, D IS THE DISCARD PILE,
60 REM--PLRSUM(I) IS THE TOTAL FOR PLAYER I, PLRHNDSUM(I) IS THE TOTAL THIS HAND FOR
6 PRINT:PRINT:PRINT
10 DEFUN TRUNCATEHAND(Q)=Q+11*(Q>=22)
20 HANDCARDS=DIM(15,12):HANDTOTAL=DIM(15):DECK=DIM(52):DISCARD=DIM(52):PTOTAL=DIM(8):THISHNDFOR=DIM(7):BETS=DIM(15)
30 CARDLEN=DIM(15)
31 ZARR=DIM(10)
40 REM--HANDCARDS(I,J) IS THE JTH CARD IN HAND I, HANDTOTAL(I) IS TOTAL OF HAND I
50 REM--DECK IS THE DECK BEING DEALT FROM, DISCARD IS THE DISCARD PILE,
60 REM--PTOTAL(I) IS THE TOTAL FOR PLAYER I, THISHNDFOR(I) IS THE TOTAL THIS HAND FOR
70 REM--PLAYER I, BETS(I) IS TH BET FOR HAND I
80 REM--HANDSLENS(I) IS THE LENGTH OF HANDS(I,*)
80 REM--CARDLEN(I) IS THE LENGTH OF HANDCARDS(I,*)
90 GOTO 1500
100 REM--SUBROUTINE TO GET A CARD. RESULT IS PUT IN X.
110 IF C<51 THEN GOTO 230
120 PRINT "RESHUFFLING"
130 FOR D=D TO 1 STEP -1
140 C=C-1
150 DECK(C)=DISCARDECK(D)
140 C=C-1
150 DECK(C)=DISCARD(D)
160 NEXT
170 FOR C1=52 TO C STEP -1
180 C2=INT(RND(1)*(C1-C+1))+C
190 C3=DECK(C2)
200 DECK(C2)=DECK(C1)
210 DECK(C1)=C3
180 C2=INT(RND(1)*(C1-C+1))+C
190 C3=DECK(C2)
200 DECK(C2)=DECK(C1)
210 DECK(C1)=C3
220 NEXT
230 X=DECK(C)
240 C=C+1
@@ -41,16 +35,14 @@
340 REM-- 22-32...HARD 11-21
350 REM-- 33+....BUSTED
360 Q=0
370 FOR Q2=1 TO HANDSLENS(I)
380 X=HANDS(I,Q2)
390 GOSUB 500
370 FOR Q2=1 TO CARDLEN(I)
380 X=HANDCARDS(I,Q2)
390 GOSUB 500
400 NEXT
410 HANDTOTAL(I)=Q
420 RETURN
500 REM--SUBROUTINE TO ADD CARD X TO TOTAL Q.
510 X1=X
511 IF X1>10 THEN X1=10
512 REM SAME AS X1=10 MIN X
510 X1=X: IF X1>10 THEN X1=10: REM SAME AS X1=10 MIN X
520 Q1=Q+X1
530 IF Q>=11 THEN GOTO 590
540 IF X>1 THEN GOTO 570
@@ -76,12 +68,10 @@
820 H1=5
830 GOSUB 1410
840 H1=3
850 REM --ON H GOTO 950,930--
851 IF H==1 THEN GOTO 950
852 IF H==2 THEN GOTO 930
850 ON H GOTO 950,930
860 GOSUB 100
870 BETS(I)=BETS(I)*2
880 PRINT "RECEIVED";
880 PRINT "RECEIVED A";
890 GOSUB 700
900 GOSUB 1100
910 IF Q>0 THEN GOSUB 1300
@@ -89,15 +79,15 @@
930 GOSUB 1320
940 RETURN
950 GOSUB 100
960 PRINT "RECEIVED";
960 PRINT "RECEIVED A";
970 GOSUB 700
980 GOSUB 1100
990 IF Q<0 THEN GOTO 940
1000 PRINT "HIT";
1010 GOTO 830
1100 REM--SUBROUTINE TO ADD A CARD TO ROW I
1110 HANDSLENS(I)=HANDSLENS(I)+1
1120 HANDS(I,HANDSLENS(I))=X
1110 CARDLEN(I)=CARDLEN(I)+1
1120 HANDCARDS(I,CARDLEN(I))=X
1130 Q=HANDTOTAL(I)
1140 GOSUB 500
1150 HANDTOTAL(I)=Q
@@ -106,24 +96,22 @@
1180 GOSUB 1200
1190 RETURN
1200 REM--SUBROUTINE TO DISCARD ROW I
1210 IF HANDSLENS(I)<>0 THEN GOTO 1230
1210 IF CARDLEN(I)<>0 THEN GOTO 1230
1220 RETURN
1230 D=D+1
1240 DISCARDECK(D)=HANDS(I,HANDSLENS(I))
1250 HANDSLENS(I)=HANDSLENS(I)-1
1240 DISCARD(D)=HANDCARDS(I,CARDLEN(I))
1250 CARDLEN(I)=CARDLEN(I)-1
1260 GOTO 1210
1300 REM--PRINTS TOTAL OF HAND I
1310 PRINT
1320 AA=HANDTOTAL(I)
1321 GOSUB 3400
1325 PRINT "TOTAL IS ";AA
1320 AA=TRUNCATEHAND(HANDTOTAL(I))
1325 PRINT "TOTAL IS";AA
1330 RETURN
1400 REM--SUBROUTINE TO READ REPLY
1410 REM ISTR DEFINED ELSEWHERE
1420 INPUT HSTR
1421 HSTR=LEFT(HSTR,1)
1420 INPUT HSTR: HSTR=LEFT(HSTR,1)
1430 FOR H=1 TO H1 STEP 2
1440 IF HSTR==MID(ISTR,H,1) THEN BREAKTO 1480
1440 IF HSTR==MID(ISTR,H,1) THEN GOTO 1480
1450 NEXT
1460 PRINT "TYPE ";MID(ISTR,1,H1-1);" OR ";MID(ISTR,H1,2);" PLEASE";
1470 GOTO 1420
@@ -131,12 +119,12 @@
1490 RETURN
1500 REM--PROGRAM STARTS HERE
1510 REM--INITIALIZE
1520 DSTR=" A 2 3 4 5 6 7 8 9 10 J Q K"
1520 DSTR="N A 2 3 4 5 6 7N 8 9 10 J Q K"
1530 ISTR="H,S,D,/,"
1540 FOR I=1 TO 13
1550 FOR J=4*I-3 TO 4*I
1560 DISCARDECK(J)=I
1570 NEXT
1550 FOR J=4*I-3 TO 4*I
1560 DISCARD(J)=I
1570 NEXT
1580 NEXT
1590 D=52
1600 C=53
@@ -157,218 +145,176 @@
1750 PRINT "BLACKJACK, THE INITIAL RESPONSE SHOULD BE 'S'."
1760 PRINT "NUMBER OF PLAYERS";
1770 INPUT N
1771 ZARR=DIM(N)
1775 PRINT
1780 IF N<1 OR N>7 OR N>INT(N) THEN GOTO 1760
1790 FOR I=1 TO 8
1791 PLRSUM(I)=0
1792 NEXT
1790 FOR I=1 TO 8: PTOTAL(I)=0: NEXT
1800 D1=N+1
1810 IF 2*D1+C>=52 THEN GOSUB 120
1820 IF C==2 THEN C=C-1
1830 FOR I=1 TO N
1831 ZARR(I)=0
1832 NEXT
1840 FOR I=1 TO 15
1841 BETS(I)=0
1842 NEXT
1850 FOR I=1 TO 15
1851 HANDTOTAL(I)=0
1852 NEXT
1860 FOR I=1 TO 7
1861 PLRHNDSUM(I)=0
1862 NEXT
1870 FOR I=1 TO 15
1871 HANDSLENS(I)=0
1872 NEXT
1830 FOR I=1 TO N: ZARR(I)=0: NEXT
1840 FOR I=1 TO 15: BETS(I)=0: NEXT
1850 FOR I=1 TO 15: HANDTOTAL(I)=0: NEXT
1860 FOR I=1 TO 7: THISHNDFOR(I)=0: NEXT
1870 FOR I=1 TO 15: CARDLEN(I)=0: NEXT
1880 PRINT "BETS:"
1890 FOR I=1 TO N
1891 PRINT "# ";I;
1892 INPUT ZARR(I)
1893 NEXT
1890 FOR I=1 TO N: PRINT "#";I;: INPUT ZARR(I): NEXT
1900 FOR I=1 TO N
1910 IF ZARR(I)<=0 OR ZARR(I)>500 THEN BREAKTO 1880
1920 BETS(I)=ZARR(I)
1910 IF ZARR(I)<=0 OR ZARR(I)>500 THEN GOTO 1880
1920 BETS(I)=ZARR(I)
1930 NEXT
1940 PRINT "PLAYER ";
1940 PRINT "PLAYER";
1950 FOR I=1 TO N
1960 PRINT I;" ";
1960 PRINT I;" ";
1970 NEXT
1980 PRINT "DEALER"
1990 FOR J=1 TO 2
2000 PRINT SPC(5);
2010 FOR I=1 TO D1
2020 GOSUB 100
2030 HANDS(I,J)=X
2040 IF J==1 OR I<=N THEN GOSUB 750
2050 NEXT
2060 PRINT
2000 PRINT SPC(5);
2010 FOR I=1 TO D1
2020 GOSUB 100
2030 HANDCARDS(I,J)=X
2040 IF J==1 OR I<=N THEN GOSUB 750
2050 NEXT
2060 PRINT
2070 NEXT
2080 FOR I=1 TO D1
2090 HANDSLENS(I)=2
2090 CARDLEN(I)=2
2100 NEXT
2110 REM--TEST FOR INSURANCE
2120 IF HANDS(D1,1)>1 THEN GOTO 2240
2120 IF HANDCARDS(D1,1)>1 THEN GOTO 2240
2130 PRINT "ANY INSURANCE";
2140 INPUT HSTR
2150 IF LEFT(HSTR,1)<>"Y" THEN GOTO 2240
2160 PRINT "INSURANCE BETS"
2170 FOR I=1 TO N
2171 PRINT "# ";I;
2172 INPUT ZARR(I)
2173 NEXT
2170 FOR I=1 TO N: PRINT "#";I;: INPUT ZARR(I): NEXT
2180 FOR I=1 TO N
2190 IF ZARR(I)<0 OR ZARR(I)>BETS(I)/2 THEN BREAKTO 2160
2190 IF ZARR(I)<0 OR ZARR(I)>BETS(I)/2 THEN GOTO 2160
2200 NEXT
2210 FOR I=1 TO N
2220 PLRHNDSUM(I)=ZARR(I)*(3*(-(HANDS(D1,2)>=10))-1)
2220 THISHNDFOR(I)=ZARR(I)*(3*(-(HANDCARDS(D1,2)>=10))-1)
2230 NEXT
2240 REM--TEST FOR DEALER BLACKJACK
2250 L1=1
2251 L2=1
2252 IF HANDS(D1,1)==1 AND HANDS(D1,2)>9 THEN L1=0
2253 L2=0
2254 IF HANDS(D1,2)==1 AND HANDS(D1,1)>9 THEN L1=0
2255 L2=0
2256 IF L1<>0 OR L2<>0 THEN GOTO 2320
2260 PRINT
2261 PRINT "DEALER HAS";MID(DSTR,3*HANDS(D1,2)-2,3);" IN THE HOLE ";
2250 L1=1: L2=1
2252 IF HANDCARDS(D1,1)==1 AND HANDCARDS(D1,2)>9 THEN L1=0: L2=0
2253 IF HANDCARDS(D1,2)==1 AND HANDCARDS(D1,1)>9 THEN L1=0: L2=0
2254 IF L1<>0 OR L2<>0 THEN GOTO 2320
2260 PRINT:PRINT "DEALER HAS A";MID(DSTR,3*HANDCARDS(D1,2)-2,3);" IN THE HOLE ";
2270 PRINT "FOR BLACKJACK"
2280 FOR I=1 TO D1
2290 GOSUB 300
2290 GOSUB 300
2300 NEXT
2310 GOTO 3140
2320 REM--NO DEALER BLACKJACK
2330 IF HANDS(D1,1)>1 AND HANDS(D1,1)<10 THEN GOTO 2350
2340 PRINT
2341 PRINT "NO DEALER BLACKJACK."
2330 IF HANDCARDS(D1,1)>1 AND HANDCARDS(D1,1)<10 THEN GOTO 2350
2340 PRINT:PRINT "NO DEALER BLACKJACK."
2350 REM--NOW PLAY THE HANDS
2360 FOR I=1 TO N
2370 PRINT "PLAYER ";I;
2380 H1=7
2390 GOSUB 1410
2400 REM--ON H GOTO 2550,2410,2510,2600--
2401 IF H==1 THEN GOTO 2550
2402 IF H==2 THEN GOTO 2410
2403 IF H==3 THEN GOTO 2510
2404 IF H==4 THEN GOTO 2600
2410 REM--PLAYER WANTS TO STAND
2420 GOSUB 300
2430 IF HANDTOTAL(I)<>21 THEN GOTO 2490
2440 PRINT "BLACKJACK"
2450 PLRHNDSUM(I)=PLRHNDSUM(I)+1.5*BETS(I)
2460 BETS(I)=0
2470 GOSUB 1200
2480 GOTO 2900
2490 GOSUB 1320
2500 GOTO 2900
2510 REM--PLAYER WANTS TO DOUBLE DOWN
2520 GOSUB 300
2530 GOSUB 860
2540 GOTO 2900
2550 REM--PLAYER WANTS TO BE HIT
2560 GOSUB 300
2570 H1=3
2580 GOSUB 950
2590 GOTO 2900
2600 REM--PLAYER WANTS TO SPLIT
2610 L1=HANDS(I,1)
2611 IF HANDS(I,1)>10 THEN L1=10
2612 L2=HANDS(I,2)
2613 IF HANDS(I,2)>10 THEN L2=10
2614 IF L1==L2 THEN GOTO 2640
2620 PRINT "SPLITTING NOT ALLOWED."
2630 GOTO 2370
2640 REM--PLAY OUT SPLIT
2650 I1=I+D1
2660 HANDSLENS(I1)=2
2670 HANDS(I1,1)=HANDS(I,2)
2680 BETS(I+D1)=BETS(I)
2690 GOSUB 100
2700 PRINT "FIRST HAND RECEIVES A";
2710 GOSUB 700
2720 HANDS(I,2)=X
2730 GOSUB 300
2740 PRINT
2750 GOSUB 100
2760 PRINT "SECOND HAND RECEIVES A";
2770 I=I1
2780 GOSUB 700
2790 HANDS(I,2)=X
2800 GOSUB 300
2810 PRINT
2820 I=I1-D1
2830 IF HANDS(I,1)==1 THEN GOTO 2900
2840 REM--NOW PLAY THE TWO HANDS
2850 PRINT "HAND ";(1-(I>D1));
2860 GOSUB 800
2870 I=I+D1
2880 IF I==I1 THEN GOTO 2850
2890 I=I1-D1
2370 PRINT "PLAYER";I;
2380 H1=7
2390 GOSUB 1410
2400 ON H GOTO 2550,2410,2510,2600
2410 REM--PLAYER WANTS TO STAND
2420 GOSUB 300
2430 IF HANDTOTAL(I)<>21 THEN GOTO 2490
2440 PRINT "BLACKJACK"
2450 THISHNDFOR(I)=THISHNDFOR(I)+1.5*BETS(I)
2460 BETS(I)=0
2470 GOSUB 1200
2480 GOTO 2900
2490 GOSUB 1320
2500 GOTO 2900
2510 REM--PLAYER WANTS TO DOUBLE DOWN
2520 GOSUB 300
2530 GOSUB 860
2540 GOTO 2900
2550 REM--PLAYER WANTS TO BE HIT
2560 GOSUB 300
2570 H1=3
2580 GOSUB 950
2590 GOTO 2900
2600 REM--PLAYER WANTS TO SPLIT
2610 L1=HANDCARDS(I,1): IF HANDCARDS(I,1)>10 THEN L1=10
2612 L2=HANDCARDS(I,2): IF HANDCARDS(I,2)>10 THEN L2=10
2614 IF L1==L2 THEN GOTO 2640
2620 PRINT "SPLITTING NOT ALLOWED."
2630 GOTO 2370
2640 REM--PLAY OUT SPLIT
2650 I1=I+D1
2660 CARDLEN(I1)=2
2670 HANDCARDS(I1,1)=HANDCARDS(I,2)
2680 BETS(I+D1)=BETS(I)
2690 GOSUB 100
2700 PRINT "FIRST HAND RECEIVES A";
2710 GOSUB 700
2720 HANDCARDS(I,2)=X
2730 GOSUB 300
2740 PRINT
2750 GOSUB 100
2760 PRINT "SECOND HAND RECEIVES A";
2770 I=I1
2780 GOSUB 700
2790 HANDCARDS(I,2)=X
2800 GOSUB 300
2810 PRINT
2820 I=I1-D1
2830 IF HANDCARDS(I,1)==1 THEN GOTO 2900
2840 REM--NOW PLAY THE TWO HANDS
2850 PRINT "HAND";1-(I>D1);
2860 GOSUB 800
2870 I=I+D1
2880 IF I==I1 THEN GOTO 2850
2890 I=I1-D1
2900 NEXT
2910 GOSUB 300
2920 REM--TEST FOR PLAYING DEALER'S HAND
2930 FOR I=1 TO N
2940 IF HANDSLENS(I)>0 OR HANDSLENS(I+D1)>0 THEN BREAKTO 3010
2940 IF CARDLEN(I)>0 OR CARDLEN(I+D1)>0 THEN GOTO 3010
2950 NEXT
2960 PRINT "DEALER HAD A";
2970 X=HANDS(D1,2)
2970 X=HANDCARDS(D1,2)
2980 GOSUB 700
2990 PRINT " CONCEALED."
3000 GOTO 3140
3010 PRINT "DEALER HAS";MID(DSTR,3*HANDS(D1,2)-2,3);" CONCEALED ";
3010 PRINT "DEALER HAS A";MID(DSTR,3*HANDCARDS(D1,2)-2,3);" CONCEALED ";
3020 I=D1
3030 AA=HANDTOTAL(I)
3031 GOSUB 3400
3035 PRINT "FOR A TOTAL OF ";AA
3030 AA=TRUNCATEHAND(HANDTOTAL(I))
3035 PRINT "FOR A TOTAL OF";AA
3040 IF AA>16 THEN GOTO 3130
3050 PRINT "DRAWS";
3060 GOSUB 100
3070 GOSUB 750
3080 GOSUB 1100
3090 AA=Q
3091 GOSUB 3400
3090 AA=TRUNCATEHAND(Q)
3095 IF Q>0 AND AA<17 THEN GOTO 3060
3100 HANDTOTAL(I)=(Q-(Q<0)/2)
3100 HANDTOTAL(I)=Q-(Q<0)/2
3110 IF Q<0 THEN GOTO 3140
3120 AA=Q
3121 GOSUB 3400
3125 PRINT "---TOTAL IS ";AA
3120 AA=TRUNCATEHAND(Q)
3125 PRINT "---TOTAL IS";AA
3130 PRINT
3140 REM--TALLY THE RESULT
3150 REM
3160 ZSTR="LOSES PUSHES WINS "
3165 PRINT
3170 FOR I=1 TO N
3180 AA=HANDTOTAL(I)
3181 GOSUB 3400
3182 AB=HANDTOTAL(I+D1)
3183 GOSUB 3410
3184 AC=HANDTOTAL(D1)
3185 GOSUB 3420
3186 PLRHNDSUM(I)=PLRHNDSUM(I)+BETS(I)*SGN(AA-AC)+BETS(I+D1)*SGN(AB-AC)
3188 BETS(I+D1)=0
3200 PRINT "PLAYER ";I;
3210 PRINT MID(ZSTR,SGN(PLRHNDSUM(I))*6+7,6);" ";
3220 IF PLRHNDSUM(I)<>0 THEN GOTO 3250
3230 PRINT " ";
3240 GOTO 3260
3250 PRINT ABS(PLRHNDSUM(I));
3260 PLRSUM(I)=PLRSUM(I)+PLRHNDSUM(I)
3270 PRINT "; TOTAL= ";PLRSUM(I)
3280 GOSUB 1200
3290 PLRSUM(D1)=PLRSUM(D1)-PLRHNDSUM(I)
3300 I=I+D1
3310 GOSUB 1200
3320 I=I-D1
3180 AA=TRUNCATEHAND(HANDTOTAL(I))
3182 AB=TRUNCATEHAND(HANDTOTAL(I+D1))
3184 AC=TRUNCATEHAND(HANDTOTAL(D1))
3186 THISHNDFOR(I)=THISHNDFOR(I)+BETS(I)*SGN(AA-AC)+BETS(I+D1)*SGN(AB-AC)
3188 BETS(I+D1)=0
3200 PRINT "PLAYER";I;
3210 PRINT MID(ZSTR,SGN(THISHNDFOR(I))*6+7,6);" ";
3220 IF THISHNDFOR(I)<>0 THEN GOTO 3250
3230 PRINT " ";
3240 GOTO 3260
3250 PRINT ABS(THISHNDFOR(I));
3260 PTOTAL(I)=PTOTAL(I)+THISHNDFOR(I)
3270 PRINT "TOTAL=";PTOTAL(I)
3280 GOSUB 1200
3290 PTOTAL(D1)=PTOTAL(D1)-THISHNDFOR(I)
3300 I=I+D1
3310 GOSUB 1200
3320 I=I-D1
3330 NEXT
3340 PRINT "DEALER'S TOTAL= ";PLRSUM(D1)
3340 PRINT "DEALER'S TOTAL=";PTOTAL(D1)
3345 PRINT
3350 GOSUB 1200
3360 GOTO 1810
3400 AA=AA+11*(AA>=22)
3401 RETURN
3410 AB=AB+11*(AB>=22)
3411 RETURN
3420 AC=AC+11*(AC>=22)
3421 RETURN

View File

@@ -0,0 +1 @@

View File

@@ -8,7 +8,8 @@ line =
linenumber = digits ;
stmt =
"IF" , expr_sans_asgn , "THEN" , stmt , ["ELSE" , stmt]
"REM" , ? anything ?
| "IF" , expr_sans_asgn , "THEN" , stmt , ["ELSE" , stmt]
| "DEFUN" , [ident] , "(" , [ident , {" , " , ident}] , ")" , "=" , expr
| "ON" , expr_sans_asgn , ("GOTO" | "GOSUB") , expr_sans_asgn , {"," , expr_sans_asgn}
| "(" , stmt , ")"

View File

@@ -37,7 +37,6 @@ digraph g {
LITERAL -> PAREN [label="()[]"]
LITERAL -> limbo [label=_]
LITERAL -> SEP [label=","]
LITERAL -> NUMBER [label="0..9"]
LITERAL -> OPERATOR [label="^*/+->=<"]
LITERAL -> LITERAL [label=otherwise]

View File

@@ -78,7 +78,8 @@ bF._parseTokens = function(lnum, tokens, states) {
/** Parses following EBNF rule:
stmt =
"IF" , expr_sans_asgn , "THEN" , stmt , ["ELSE" , stmt]
"REM" , ? anything ?
| "IF" , expr_sans_asgn , "THEN" , stmt , ["ELSE" , stmt]
| "DEFUN" , [ident] , "(" , [ident , {" , " , ident}] , ")" , "=" , expr
| "ON" , expr_sans_asgn , ident , expr_sans_asgn , {"," , expr_sans_asgn}
| "(" , stmt , ")"
@@ -90,14 +91,6 @@ bF._parseStmt = function(lnum, tokens, states, recDepth) {
/*************************************************************************/
let headTkn = tokens[0].toUpperCase();
let headSta = states[0];
let treeHead = new BasicAST();
treeHead.astLnum = lnum;
/*************************************************************************/
// case for: single word (e.g. NEXT for FOR loop)
if (tokens.length == 1 && states.length == 1) {
bF.parserPrintdbgline('$', "Single Word Function Call", lnum, recDepth);
@@ -106,6 +99,19 @@ bF._parseStmt = function(lnum, tokens, states, recDepth) {
/*************************************************************************/
let headTkn = tokens[0].toUpperCase();
let headSta = states[0];
let treeHead = new BasicAST();
treeHead.astLnum = lnum;
/*************************************************************************/
// case for: "REM" , ? anything ?
if (headTkn == "REM" && headSta != "qot") return;
/*************************************************************************/
let parenDepth = 0;
let parenStart = -1;
let parenEnd = -1;