今天發(fā)現(xiàn)了自己一直都理解錯(cuò)的一個(gè)問(wèn)題:邏輯運(yùn)算符的優(yōu)先級(jí)問(wèn)題。
取反的優(yōu)先級(jí)最高
&&的優(yōu)先級(jí)次之
||的優(yōu)先級(jí)最低。
今天要將循環(huán)語(yǔ)句翻譯成中間代碼。由于一直沒(méi)有找到很明確的關(guān)于條件表達(dá)式的語(yǔ)法定義。在此將自己定義的語(yǔ)法結(jié)構(gòu)記下啦,希望大家多多指教:
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
至于更細(xì)節(jié)的地方在此不做贅述。
對(duì)于結(jié)構(gòu)產(chǎn)生式的左邊每一個(gè)非終結(jié)符有一個(gè)對(duì)應(yīng)的方法。根據(jù)語(yǔ)法定義調(diào)用即可。
如果需要代碼請(qǐng)留言,并注明郵箱,發(fā)給你!!

生成控制流代碼時(shí)采用
回填技術(shù)。我覺(jué)得龍書《Compilers,Principles,Techniques,&Tools 》second Editon對(duì)于回填技術(shù)講的很清楚。