语法制导翻译——语义分析

  • 语义分析中间代码生成可以同时进行,称为语义翻译
  • 语法分析语义分析中间代码生成可以同时进行,称为语法制导翻译

参考:https://liuyehcf.github.io/2017/11/06/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86-%E8%AF%AD%E6%B3%95%E5%88%B6%E5%AF%BC%E7%BF%BB%E8%AF%911/

  1. SDT中的语义分析,和中间代码生成绑到一块了;
  2. 在花括号中执行语义动作(可以包括生成中间代码和类型检查),就认为是计算了节点属性;

  参考:第三个回答https://www.zhihu.com/question/27594539

  1. 而属性是什么完全是看需求来的。

 

预备知识:

  1. PLY不会为用户生成符号表,参考龙书P53知符号表不一定要在词法分析时创建,可以在语法分析时创建,每次遇到标识符的声明即在符号表中创建一个该标识符的条目,符号表参考要检查的错误类型确定其数据类型,P56标明使用SDT和使用符号表的关系

  2. 在语法分析构建语法分析树时添加语义动作,包括类型检查和中间代码生成。添加的动作在parser.py中尽量简洁,可以引入自定义模块,使用该模块中的方法。

  参考:https://cs.nju.edu.cn/chenlin/pages/compiler/5_Syntax-Directed_Translation.pdf 在语法树上实现SDT部分

语义分析需要检查的错误类型:

  1. 声明时看是否重复声明,否则添加声明,
  2. 使用变量时看是否声明
  3. 赋值时判断两边类型是否一致
  4. 对方法查看是否有该内置方法,
  5. 方法的参数类型,个数是否正确

所有错误类型参考:https://cs.nju.edu.cn/daixinyu/1007.pdf

https://www.cnblogs.com/Ninputer/archive/2011/07/22/2112030.html

 

 

参考:

语义分析错误类型:https://cs.nju.edu.cn/daixinyu/1007.pdf

语法制导翻译过程:https://home.adelphi.edu/~siegfried/cs372/372l8.pdf

编译原理国外系列教程,含SDT:https://www.tutorialspoint.com/compiler_design/compiler_design_semantic_analysis.htm

自己动手开发编译器之语义分析,含JAVA代码:https://www.cnblogs.com/Ninputer/archive/2011/07/22/2112030.html

阿里大佬写的语法树和分析树,解释器的实现https://www.kaimingwan.com/post/ji-chu-zhi-shi/bian-yi-qi-jie-shi-qi/shi-xian-pascaljie-shi-qi-7

语义分析总结性博客:https://www.hashcoding.net/2015/12/10/%E4%BA%94%E3%80%81%E8%AF%AD%E4%B9%89%E5%88%86%E6%9E%90/

AST到中间代码生成,以js为例:http://jartto.wang/2018/11/17/about-ast/

没看的,SDT的介绍:https://blog.csdn.net/jzyhywxz/article/details/78679973

 

编译器优化

可以参考的资料:

https://withcic.cn/2017/12/28/grammarParser/index.html

https://www.wmathor.com/index.php/archives/1139/

https://blog.csdn.net/haohulala/article/details/81213516

原文地址:https://www.cnblogs.com/IcarusYu/p/11021733.html