https://github.com/KINGDOMQUEEN/Dragonbook-
https://github.com/SH4DY/dragonbook-compiler
构造函数的递归,递归地构造树
figure 2-39:
program -> block { return block.n;}
block -> '{' stmts '}' { block.n = stmts.n;}
stmts -> stmts1 stmts { stmts.n = new Seq(stmts1.n, stmt.n); }
| e { stmts.n = new null; }
stmt -> expr; { stmt.n = new Eval(expr.n); }
| if( expr ) stmt1 { stmt.n = new If( expr.n, stmt1.n ); }
| while( expr ) stmt1 { stmt.n = new While(expr.n, stmt1.n); }
| do stmt1 while( expr ); { stmt.n = new Do( stmt1.n, expr.n ); }
| block { stmt.n = block.n; }
expr -> rel = expr1 { expr.n = new Assign('=', rel.n, expr1.n); }
| rel { expr.n = rel.n; }
rel -> rel1 < add { rel.n = new Rel('<', rel1.n, add.n); }
| rel1 <= add { rel.n = new Rel('<=', rel1.n, add.n); }
|add { rel.n = add.n; }
add -> add1 + term { add.n = new Op('+', add1.n, term.n); }
| term { add.n = term.n; }
term -> term1 * factor {term.n = new Op('*', term1.n, factor.n);}
| factor { term.n = factor.n; }
factor-> ( expr ) { factor.n = expr.n; }
| num { factor.n = new Num(num.value); }