xyjzsh

编译项目跟踪文档(二)

今天发现了自己一直都理解错的一个问题:逻辑运算符的优先级问题。
取反的优先级最高
&&的优先级次之
||的优先级最低。

今天要将循环语句翻译成中间代码。由于一直没有找到很明确的关于条件表达式的语法定义。在此将自己定义的语法结构记下啦,希望大家多多指教:

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对于回填技术讲的很清楚。



posted on 2010-11-02 16:10 呆人 阅读(1328) 评论(1)  编辑 收藏 引用

评论

# re: 编译项目跟踪文档(二) 2010-11-02 18:31 lwch

用自顶向下的方法很容易对这类语法,运算符优先级越高就越先被归约..  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜