本文共 960 字,大约阅读时间需要 3 分钟。
构造函数的递归,递归地构造树
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); }转载地址:http://vwfmf.baihongyu.com/