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

该博客详细介绍了如何使用递归方式构造程序的语法树,基于《Dragonbook》的编译原理。内容涵盖从程序到块、语句、表达式的递归转换,涉及赋值、比较、加法、乘法等操作符的处理,以及if、while、do-while等控制结构的构建。通过实例解析了编译器构造过程中的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值