今天发现了自己一直都理解错的一个问题:逻辑运算符的优先级问题。
取反的优先级最高
&&的优先级次之
||的优先级最低。
今天要将循环语句翻译成中间代码。由于一直没有找到很明确的关于条件表达式的语法定义。在此将自己定义的语法结构记下啦,希望大家多多指教:
IF(BoolExp)
{
StmtSequence
}
ELSE
{
StmtSequence
}
BoolExp
----> BoolTerm | || BoolTerm
BoolTerm ----> BoolFactor | && BoolFactor
BoolFactor ----> (BoolExp) | RelExp | !BoolExp
RelExp ----> ArithExp relOp ArithExp
ArithExp ----> ArithTerm | +ArithTerm | -ArithTerm
ArithTerm ----> ArithFactor | *ArithFactor | /ArithFactor
ArithFactor -----> ID | NUM| Func| (ArithExp)
relOp -----> > | >= | < |<= | == | !=
StmtSequence -> Stmt | ;Stmt
Stmt -> AssignStmt | DeclareStmt | ConditionalStmt | CallFuncStmt
至于更细节的地方在此不做赘述。
对于结构产生式的左边每一个非终结符有一个对应的方法。根据语法定义调用即可。
如果需要代码请留言,并注明邮箱,发给你!!
生成控制流代码时采用
回填技术。我觉得龙书《Compilers,Principles,Techniques,&Tools 》second Editon对于回填技术讲的很清楚。