From 9ca9990a19ee55aa51a832cc4cad81fa23270592 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 16 Dec 2020 15:13:03 +0900 Subject: [PATCH] basic: fix: would crap out when 'REM' is not a first statement of a line --- assets/basic.js | 29 ++- assets/blackjack.bas | 352 ++++++++++++----------------- assets/tbas/doc/statements.tex | 1 + assets/tbas/{ => doc}/syntax.txt | 3 +- assets/tbas/{ => doc}/tokeniser.gv | 1 - assets/tbas/parser_wip.js | 24 +- 6 files changed, 185 insertions(+), 225 deletions(-) create mode 100644 assets/tbas/doc/statements.tex rename assets/tbas/{ => doc}/syntax.txt (97%) rename assets/tbas/{ => doc}/tokeniser.gv (98%) diff --git a/assets/basic.js b/assets/basic.js index 1bb4087..a576de2 100644 --- a/assets/basic.js +++ b/assets/basic.js @@ -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 diff --git a/assets/blackjack.bas b/assets/blackjack.bas index f670266..7e8a333 100644 --- a/assets/blackjack.bas +++ b/assets/blackjack.bas @@ -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 diff --git a/assets/tbas/doc/statements.tex b/assets/tbas/doc/statements.tex new file mode 100644 index 0000000..8d1c8b6 --- /dev/null +++ b/assets/tbas/doc/statements.tex @@ -0,0 +1 @@ + diff --git a/assets/tbas/syntax.txt b/assets/tbas/doc/syntax.txt similarity index 97% rename from assets/tbas/syntax.txt rename to assets/tbas/doc/syntax.txt index 7d8e25a..5bd333d 100644 --- a/assets/tbas/syntax.txt +++ b/assets/tbas/doc/syntax.txt @@ -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 , ")" diff --git a/assets/tbas/tokeniser.gv b/assets/tbas/doc/tokeniser.gv similarity index 98% rename from assets/tbas/tokeniser.gv rename to assets/tbas/doc/tokeniser.gv index f9a7fac..c4d9302 100644 --- a/assets/tbas/tokeniser.gv +++ b/assets/tbas/doc/tokeniser.gv @@ -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] diff --git a/assets/tbas/parser_wip.js b/assets/tbas/parser_wip.js index 300678f..a4faf71 100644 --- a/assets/tbas/parser_wip.js +++ b/assets/tbas/parser_wip.js @@ -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;