Skip to content

Commit 1bc160f

Browse files
committed
Move LineNo, EOL into Stmts
1 parent 18933c7 commit 1bc160f

1 file changed

Lines changed: 59 additions & 57 deletions

File tree

grammar.y

Lines changed: 59 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
%token <int> KEYWORD IDENT STRING INTEGER RELOP DATASTRING
1212
%token <double> NUMBER
1313
%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
1515
%nterm <Parser.Expr> Expr
1616
%nterm <int[]> IdSq GotoSq
1717
%nterm <Parser.Expr[]> ExprSq
@@ -43,65 +43,67 @@
4343
%%
4444

4545
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; }
7173
// 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($$); }
8385
// 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 {}
9092
// 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($$); }
105107
;
106108

107109
Print : %empty { $$ = new NewLine(); }

0 commit comments

Comments
 (0)