形式语言与自动机14 语义分析预备知识
程序语言基本上可以分为三大类:
- 声明语句:
- 简单变量声明
- 数组、结构体变量声明
- 赋值语句:
- 能产生实际机器代码的核心语句
- 控制语句 :
- If 语句
- while 语句
- 函数调用
一段程序用 JAVA字节码 表示
机器抽象表示
一个虚拟机器可以用以下三部分建模:
- 处理器
- 内存
- 指令系统
处理器可以用自己写的数据结构建模;
内存就更好办了,用一个数组表示一段存储
一台机器就可以如上new出来
语法制导
语法制导具体实现:
对LR的栈再次进行扩充:
捆绑:符号栈、状态栈、语义值栈
语义值栈中放的是与符号栈中符号相关的一些语义值
上面这个是人为设计的,由上面这个我们可以得到下面这个
这里没听懂……
语义分析过程:
语法分析树+语义分析 = 中间表示
现阶段,我们知道语法分析树和中间表示(汇编机器码),反推语义分析
属性文法
属性文法是对CFG的扩展,扩展了属性和属性方程(函数)
属性值计算是在语法分析的过程中进行的
这就是在语法制导下 完成语义分析
语义分析我们使用的时候一般是已经给出来了属性文法,根据属性文法进行语义分析比较简单;但是设计属性文法是一件比较难的事儿。
属性的值被绑定时间不是一样的:
语义分析相对于语法分析貌似是原来的句子变成含有真正意义的值。
综合属性:某节点属性依赖于所有子节点
继承属性:某节点属性依赖于父节点和兄弟节点(不是综合属性的就是继承属性)