今天發現了自己一直都理解錯的一個問題:邏輯運算符的優先級問題。
取反的優先級最高
&&的優先級次之
||的優先級最低。
今天要將循環語句翻譯成中間代碼。由于一直沒有找到很明確的關于條件表達式的語法定義。在此將自己定義的語法結構記下啦,希望大家多多指教:
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對于回填技術講的很清楚。