编译原理问题--优先关系表怎么画
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译原理问题--优先关系表怎么画相关的知识,希望对你有一定的参考价值。
对应文法G
G:S->V
V->T|VaT
T->F|TbF
F->cVd|e
由于优先级符号比较难写请用>,=,<等相似符号代替,谢谢各位大侠
先求出FIRSTVT和LASTVT。
找Firstvt的三条规则: 如果要找A的Firstvt,A的候选式中出现:
A->a.......,即以终结符开头,该终结符入Firstvt
A->B.......,即以非终结符开头,该非终结符的Firstvt入A的Firstvt
A->Ba.....,即先以非终结符开头,紧跟终结符,则终结符入Firstvt
找Lastvt的三条规则: 如果要找A的Lastvt,A的候选式中出现:
A->.......a,即以终结符结尾,该终结符入Lastvt
A->.......B,即以非终结符结尾,该非终结符的Lastvt入A的Lastvt
A->.....aB,即先以非终结符结尾,前面是终结符,则终结符入Lastvt
然后逐条扫描文法规则。例题如下,参考这个例题能很好地理解如何构造优先关系表。
《编译原理》(第4版)第三章例题4.12
参考技术A 分别求出各个VN里的First和Last集合,然后比如有T->TbF,那么FirstF就==b==LastT,这里有两条规则,编译原理的书上都有啊!你看下应该能明白了,画出来的表格应该是6*6的表格 参考技术B c=d>b>a符号表和抽象语法树是啥关系?两者在编译器设计中是不是必需
参考技术A 一般的编译器可能包含下面这些模块:1, 词法分析器:
输入: 源代码
输出: token
2, 语法分析器:
输入: token
输出: AST
在这个过程中, 可以识别出不符合语法规则的语句, 就可以报syntax错误, 如果有syntax错误, 编译结束
3, 语义分析器:
输入: AST
输出: 无
在这个过程中, 根据语言的语义规则来识别语义错误, 要识别语义错误 就必须编译AST, 因为是树的遍历, 假如你先遍历到了int a 这个节点, 接着又遍历到了一个表达式a = 4这个节点, 你需要检查变量a有没有声明啊, 变量a和4的类型批不匹配呢? 这时你如果没有保存变量a的信息, 那么你怎么检查? 所以就需要符号表来保存这些信息了.
4, 代码优化:
最简单的就是常量折叠优化了, 比如: a = 1 + 2 这个语句可以直接换成: a = 3了, 也就是说在编译阶段就把一些必要的运算先计算完成, 在程序运行的时候就不需要计算这些了, 就提高了程序的运行效率. 这部分是最复杂的了, 还有各种各样各样的优化
5, 代码生成:
输入: AST
输出: 可以是虚拟机代码, 可以是本地汇编代码
以上是关于编译原理问题--优先关系表怎么画的主要内容,如果未能解决你的问题,请参考以下文章