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) { "DIM" : function(lnum, stmtnum, args) {
return varArgNum(lnum, args, (revdims) => { return varArgNum(lnum, stmtnum, args, (revdims) => {
let dims = revdims.reverse(); let dims = revdims.reverse();
let arraydec = "Array(dims[0]).fill(0)"; let arraydec = "Array(dims[0]).fill(0)";
for (let k = 1; k < dims.length; k++) { 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 headTkn = tokens[0].toUpperCase();
let headSta = states[0]; 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) // case for: "REM" , ? anything ?
if (tokens.length == 1 && states.length == 1) { if (headTkn == "REM" && headSta != "qot") return;
bF.parserPrintdbgline('$', "Single Word Function Call", lnum, recDepth);
return bF._parseLit(lnum, tokens, states, recDepth + 1, true);
}
/*************************************************************************/ /*************************************************************************/
@@ -2773,11 +2778,13 @@ bF.run = function(args) { // RUN function
let trees = bF._interpretLine(linenum, linestr.trim()); let trees = bF._interpretLine(linenum, linestr.trim());
programTrees[linenum] = trees programTrees[linenum] = trees
// do prescan job (data, label, etc) // do prescan job (data, label, etc)
trees.forEach((t, i) => { if (trees !== undefined) {
if (bF.prescanStmts.includes(t.astValue)) { trees.forEach((t, i) => {
bF._executeAndGet(linenum, i, t); if (t !== undefined && bF.prescanStmts.includes(t.astValue)) {
} bF._executeAndGet(linenum, i, t);
}) }
})
}
}); });
// actually execute the program // actually execute the program

View File

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

View File

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

View File

@@ -78,7 +78,8 @@ bF._parseTokens = function(lnum, tokens, states) {
/** Parses following EBNF rule: /** Parses following EBNF rule:
stmt = stmt =
"IF" , expr_sans_asgn , "THEN" , stmt , ["ELSE" , stmt] "REM" , ? anything ?
| "IF" , expr_sans_asgn , "THEN" , stmt , ["ELSE" , stmt]
| "DEFUN" , [ident] , "(" , [ident , {" , " , ident}] , ")" , "=" , expr | "DEFUN" , [ident] , "(" , [ident , {" , " , ident}] , ")" , "=" , expr
| "ON" , expr_sans_asgn , ident , expr_sans_asgn , {"," , expr_sans_asgn} | "ON" , expr_sans_asgn , ident , expr_sans_asgn , {"," , expr_sans_asgn}
| "(" , stmt , ")" | "(" , 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) // case for: single word (e.g. NEXT for FOR loop)
if (tokens.length == 1 && states.length == 1) { if (tokens.length == 1 && states.length == 1) {
bF.parserPrintdbgline('$', "Single Word Function Call", lnum, recDepth); 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 parenDepth = 0;
let parenStart = -1; let parenStart = -1;
let parenEnd = -1; let parenEnd = -1;