|
11 | 11 | %token <int> KEYWORD IDENT STRING INTEGER RELOP DATASTRING |
12 | 12 | %token <double> NUMBER |
13 | 13 | %token <string> MATHFN |
14 | | -%nterm <Parser.Node> Stmt Print PrintSq PrintSt PrintEn PrintTa Read MatPr MatPrSq MatPrSt MatPrEn MatRead Input |
| 14 | +%nterm <Parser.Node> LineNo Stmt Print PrintSq PrintSt PrintEn PrintTa Read MatPr MatPrSq MatPrSt MatPrEn MatRead Input |
15 | 15 | %nterm <Parser.Expr> Expr |
16 | 16 | %nterm <int[]> IdSq GotoSq |
17 | 17 | %nterm <Parser.Expr[]> ExprSq |
|
43 | 43 | %% |
44 | 44 |
|
45 | 45 | Stmts : %empty |
46 | | - | Stmts Stmt |
47 | | - ; |
48 | | - |
49 | | -Stmt : LINENO { $$ = new Line($1); next = next.link($$); } |
50 | | - // BASIC the First |
51 | | - | STOP EOL { $$ = new Stop(); next = next.link($$); } |
52 | | - | PRINT Print EOL { $$ = new Branch($2); next = next.link($$); } |
53 | | - | GO TO INTEGER EOL { $$ = new Goto(cast(ushort)$3); next = next.link($$); } |
54 | | - | GOSUB INTEGER EOL { $$ = new GoSub(cast(ushort)$2); next = next.link($$); } |
55 | | - | LET IDENT ASSIGN Expr EOL { $$ = new Let($2, $4); next = next.link($$); } |
56 | | - | LET IDENT LPAREN Expr RPAREN ASSIGN Expr EOL { $$ = new LetDim($2, $4, $7); next = next.link($$); } |
57 | | - | LET IDENT LPAREN Expr COMMA Expr RPAREN ASSIGN Expr EOL { $$ = new LetDim2($2, $4, $6, $9); next = next.link($$); } |
58 | | - | IF Expr RELOP Expr THEN INTEGER EOL { $$ = new If($2, $3, $4, cast(ushort)$6); next = next.link($$); } |
59 | | - | IF Expr ASSIGN Expr THEN INTEGER EOL { $$ = new If($2, TokenKind.EQ, $4, cast(ushort)$6); next = next.link($$); } |
60 | | - | FOR IDENT ASSIGN Expr TO Expr STEP Expr EOL { $$ = new For($2, $4, $6, $8); next = next.link($$); } |
61 | | - | FOR IDENT ASSIGN Expr TO Expr EOL { $$ = new For($2, $4, $6, new Constant(symtab.installConstant(1.0))); next = next.link($$); } |
62 | | - | NEXT IDENT EOL { $$ = new Next($2); next = next.link($$); } |
63 | | - | DATA DataSq EOL {} |
64 | | - | READ ReadSq EOL {} |
65 | | - | DIM DimSq EOL {} |
66 | | - | DEF FN IDENT LPAREN IdSq RPAREN ASSIGN Expr EOL { foreach(id; $5) symtab.initializeId(id); symtab.addFunction($3, SymbolTable.Function($5, $8, -1, $5.length)); } |
67 | | - | DEF FN IDENT ASSIGN Expr EOL { symtab.addFunction($3, SymbolTable.Function(new int[0], $5, -1, 0)); } |
68 | | - | RETURN EOL { $$ = new Return(); next = next.link($$); } |
69 | | - | REM EOL { } |
70 | | - | END EOL { symtab.checkReferences(); return YYACCEPT; } |
| 46 | + | Stmts LineNo Stmt EOL |
| 47 | + ; |
| 48 | + |
| 49 | +LineNo : LINENO { $$ = new Line($1); next = next.link($$); } |
| 50 | + ; |
| 51 | + |
| 52 | +Stmt // BASIC the First |
| 53 | + : STOP { $$ = new Stop(); next = next.link($$); } |
| 54 | + | PRINT Print { $$ = new Branch($2); next = next.link($$); } |
| 55 | + | GO TO INTEGER { $$ = new Goto(cast(ushort)$3); next = next.link($$); } |
| 56 | + | GOSUB INTEGER { $$ = new GoSub(cast(ushort)$2); next = next.link($$); } |
| 57 | + | LET IDENT ASSIGN Expr { $$ = new Let($2, $4); next = next.link($$); } |
| 58 | + | LET IDENT LPAREN Expr RPAREN ASSIGN Expr { $$ = new LetDim($2, $4, $7); next = next.link($$); } |
| 59 | + | LET IDENT LPAREN Expr COMMA Expr RPAREN ASSIGN Expr { $$ = new LetDim2($2, $4, $6, $9); next = next.link($$); } |
| 60 | + | IF Expr RELOP Expr THEN INTEGER { $$ = new If($2, $3, $4, cast(ushort)$6); next = next.link($$); } |
| 61 | + | IF Expr ASSIGN Expr THEN INTEGER { $$ = new If($2, TokenKind.EQ, $4, cast(ushort)$6); next = next.link($$); } |
| 62 | + | FOR IDENT ASSIGN Expr TO Expr STEP Expr { $$ = new For($2, $4, $6, $8); next = next.link($$); } |
| 63 | + | FOR IDENT ASSIGN Expr TO Expr { $$ = new For($2, $4, $6, new Constant(symtab.installConstant(1.0))); next = next.link($$); } |
| 64 | + | NEXT IDENT { $$ = new Next($2); next = next.link($$); } |
| 65 | + | DATA DataSq {} |
| 66 | + | READ ReadSq {} |
| 67 | + | DIM DimSq {} |
| 68 | + | DEF FN IDENT LPAREN IdSq RPAREN ASSIGN Expr { foreach(id; $5) symtab.initializeId(id); symtab.addFunction($3, SymbolTable.Function($5, $8, -1, $5.length)); } |
| 69 | + | DEF FN IDENT ASSIGN Expr { symtab.addFunction($3, SymbolTable.Function(new int[0], $5, -1, 0)); } |
| 70 | + | RETURN { $$ = new Return(); next = next.link($$); } |
| 71 | + | REM { } |
| 72 | + | END { symtab.checkReferences(); return YYACCEPT; } |
71 | 73 | // BASIC the Second (CardBasic) |
72 | | - | MAT READ MatRdSq EOL {} |
73 | | - | MAT PRINT MatPr EOL { $$ = new Branch($3); next = next.link($$); } |
74 | | - | MAT IDENT ASSIGN IDENT PLUS IDENT EOL { $$ = new MatAdd($2, $4, $6); next = next.link($$); } |
75 | | - | MAT IDENT ASSIGN IDENT MINUS IDENT EOL { $$ = new MatSub($2, $4, $6); next = next.link($$); } |
76 | | - | MAT IDENT ASSIGN IDENT TIMES IDENT EOL { $$ = new MatMul($2, $4, $6); next = next.link($$); } |
77 | | - | MAT IDENT ASSIGN ZER LPAREN Expr COMMA Expr RPAREN EOL { $$ = new MatZerCon($2, $6, $8); next = next.link($$); } |
78 | | - | MAT IDENT ASSIGN CON LPAREN Expr COMMA Expr RPAREN EOL { $$ = new MatZerCon($2, $6, $8, true); next = next.link($$); } |
79 | | - | MAT IDENT ASSIGN IDN LPAREN Expr RPAREN EOL { $$ = new MatIdn($2, $6); next = next.link($$); } |
80 | | - | MAT IDENT ASSIGN TRN LPAREN IDENT RPAREN EOL { $$ = new MatTrn($2, $6); next = next.link($$); } |
81 | | - | MAT IDENT ASSIGN INV LPAREN IDENT RPAREN EOL { $$ = new MatInv($2, $6); next = next.link($$); } |
82 | | - | MAT IDENT ASSIGN LPAREN Expr RPAREN TIMES IDENT EOL { $$ = new MatScalar($2, $8, $5); next = next.link($$); } |
| 74 | + | MAT READ MatRdSq {} |
| 75 | + | MAT PRINT MatPr { $$ = new Branch($3); next = next.link($$); } |
| 76 | + | MAT IDENT ASSIGN IDENT PLUS IDENT { $$ = new MatAdd($2, $4, $6); next = next.link($$); } |
| 77 | + | MAT IDENT ASSIGN IDENT MINUS IDENT { $$ = new MatSub($2, $4, $6); next = next.link($$); } |
| 78 | + | MAT IDENT ASSIGN IDENT TIMES IDENT { $$ = new MatMul($2, $4, $6); next = next.link($$); } |
| 79 | + | MAT IDENT ASSIGN ZER LPAREN Expr COMMA Expr RPAREN { $$ = new MatZerCon($2, $6, $8); next = next.link($$); } |
| 80 | + | MAT IDENT ASSIGN CON LPAREN Expr COMMA Expr RPAREN { $$ = new MatZerCon($2, $6, $8, true); next = next.link($$); } |
| 81 | + | MAT IDENT ASSIGN IDN LPAREN Expr RPAREN { $$ = new MatIdn($2, $6); next = next.link($$); } |
| 82 | + | MAT IDENT ASSIGN TRN LPAREN IDENT RPAREN { $$ = new MatTrn($2, $6); next = next.link($$); } |
| 83 | + | MAT IDENT ASSIGN INV LPAREN IDENT RPAREN { $$ = new MatInv($2, $6); next = next.link($$); } |
| 84 | + | MAT IDENT ASSIGN LPAREN Expr RPAREN TIMES IDENT { $$ = new MatScalar($2, $8, $5); next = next.link($$); } |
83 | 85 | // BASIC the Third |
84 | | - | MAT IDENT ASSIGN ZER EOL { $$ = new MatZerConIdnDim($2, 0); next = next.link($$); } |
85 | | - | MAT IDENT ASSIGN CON EOL { $$ = new MatZerConIdnDim($2, 1); next = next.link($$); } |
86 | | - | MAT IDENT ASSIGN IDN EOL { $$ = new MatZerConIdnDim($2, 2); next = next.link($$); } |
87 | | - | MAT INPUT IDENT EOL { $$ = new MatInput($3); next = next.link($$); } |
88 | | - | RESTORE EOL { $$ = new Restore(); next = next.link($$); } |
89 | | - | INPUT InputSq EOL {} |
| 86 | + | MAT IDENT ASSIGN ZER { $$ = new MatZerConIdnDim($2, 0); next = next.link($$); } |
| 87 | + | MAT IDENT ASSIGN CON { $$ = new MatZerConIdnDim($2, 1); next = next.link($$); } |
| 88 | + | MAT IDENT ASSIGN IDN { $$ = new MatZerConIdnDim($2, 2); next = next.link($$); } |
| 89 | + | MAT INPUT IDENT { $$ = new MatInput($3); next = next.link($$); } |
| 90 | + | RESTORE { $$ = new Restore(); next = next.link($$); } |
| 91 | + | INPUT InputSq {} |
90 | 92 | // BASIC the Fourth |
91 | | - | LET IDENT DOLLAR ASSIGN StrExpr EOL { $$ = new LetString($2, $5); next = next.link($$); } |
92 | | - | LET IDENT DOLLAR LPAREN Expr RPAREN ASSIGN StrExpr EOL { $$ = new LetDimString($2, $5, $8); next = next.link($$); } |
93 | | - | IF StrExpr RELOP StrExpr THEN INTEGER EOL { $$ = new IfString($2, $3, $4, cast(ushort)$6); next = next.link($$); } |
94 | | - | IF StrExpr ASSIGN StrExpr THEN INTEGER EOL { $$ = new IfString($2, TokenKind.EQ, $4, cast(ushort)$6); next = next.link($$); } |
95 | | - | ON Expr GotoThen GotoSq EOL { $$ = new OnGoto($2, $4); next = next.link($$); } |
96 | | - | CHANGE IDENT DOLLAR TO IDENT EOL { $$ = new ChangeFromString($2, $5); next = next.link($$); } |
97 | | - | CHANGE IDENT TO IDENT DOLLAR EOL { $$ = new ChangeToString($2, $4); next = next.link($$); } |
98 | | - | RANDOM EOL { $$ = new Randomize(); next = next.link($$); } |
99 | | - | RESTORE TIMES EOL { $$ = new Restore(true, false); next = next.link($$); } |
100 | | - | RESTORE DOLLAR EOL { $$ = new Restore(false, true); next = next.link($$); } |
101 | | - | DEF FN IDENT LPAREN IdSq RPAREN EOL { foreach(id; $5) symtab.initializeId(id); symtab.addFunction($3, SymbolTable.Function($5, null, symtab.line, $5.length)); symtab.registerFlow(symtab.line); } |
102 | | - | DEF FN IDENT EOL { symtab.addFunction($3, SymbolTable.Function(new int[0], null, symtab.line, 0)); symtab.registerFlow(symtab.line); } |
103 | | - | LET FN IDENT ASSIGN Expr EOL { $$ = new Let(symtab.installId("FN" ~ symtab.getId($3)), $5); next = next.link($$); } |
104 | | - | FN END EOL { $$ = new Return(); next = next.link($$); } |
| 93 | + | LET IDENT DOLLAR ASSIGN StrExpr { $$ = new LetString($2, $5); next = next.link($$); } |
| 94 | + | LET IDENT DOLLAR LPAREN Expr RPAREN ASSIGN StrExpr { $$ = new LetDimString($2, $5, $8); next = next.link($$); } |
| 95 | + | IF StrExpr RELOP StrExpr THEN INTEGER { $$ = new IfString($2, $3, $4, cast(ushort)$6); next = next.link($$); } |
| 96 | + | IF StrExpr ASSIGN StrExpr THEN INTEGER { $$ = new IfString($2, TokenKind.EQ, $4, cast(ushort)$6); next = next.link($$); } |
| 97 | + | ON Expr GotoThen GotoSq { $$ = new OnGoto($2, $4); next = next.link($$); } |
| 98 | + | CHANGE IDENT DOLLAR TO IDENT { $$ = new ChangeFromString($2, $5); next = next.link($$); } |
| 99 | + | CHANGE IDENT TO IDENT DOLLAR { $$ = new ChangeToString($2, $4); next = next.link($$); } |
| 100 | + | RANDOM { $$ = new Randomize(); next = next.link($$); } |
| 101 | + | RESTORE TIMES { $$ = new Restore(true, false); next = next.link($$); } |
| 102 | + | RESTORE DOLLAR { $$ = new Restore(false, true); next = next.link($$); } |
| 103 | + | DEF FN IDENT LPAREN IdSq RPAREN { foreach(id; $5) symtab.initializeId(id); symtab.addFunction($3, SymbolTable.Function($5, null, symtab.line, $5.length)); symtab.registerFlow(symtab.line); } |
| 104 | + | DEF FN IDENT { symtab.addFunction($3, SymbolTable.Function(new int[0], null, symtab.line, 0)); symtab.registerFlow(symtab.line); } |
| 105 | + | LET FN IDENT ASSIGN Expr { $$ = new Let(symtab.installId("FN" ~ symtab.getId($3)), $5); next = next.link($$); } |
| 106 | + | FN END { $$ = new Return(); next = next.link($$); } |
105 | 107 | ; |
106 | 108 |
|
107 | 109 | Print : %empty { $$ = new NewLine(); } |
|
0 commit comments