dragonbook compilers principles, techniques, & Tools不错的附录A源代码

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); }

猜你喜欢

转载自blog.csdn.net/eloudy/article/details/117718676
今日推荐