之前写了12篇使用有限自动机(DFA)分析语法的文章,今天说一下语义分析。
怎么用C语言写语法分析3,基于有限自动机的表达式分析
怎么用C语言写语法分析
用C语言实现一个真正的词法分析器
语义分析,也是编译器前端的一个模块。
一般来说,它比语法分析要简单。
程序源码的各种复杂逻辑,在经过语法分析之后,就成了一棵抽象语法树(AST)。
生成这个语法树比较难,因为源代码里互相耦合的概念太多。
生成语法树之后,把树遍历一次,就可以完成语义分析。
不同的语句和运算符,构成了语法树的不同节点。不同的节点有不同的处理函数。在处理函数里检查类型是否一致、计算中间结果、化简常量表达式、添加类型的自动转换(type cast)。
之后,就可以生成三地址码了。从生成三地址码开始,已经是编译器的后端了。
如上图,是语法树的节点数据结构。
因为是多叉树,所以有个父节点的指针parent,子节点组成一个指针数组,由nodes和nb_nodes表示。
31行的scf_operator_t* op,表示节点的操作符。不管是语句还是运算符,一律看作一种操作符。
把所有的操作符组成一个大数组,就是支持的所有语义。
(把人能看懂的源码文本,终于变成了机器能处理的数据结构了)
第1列,用一个整数表示操作符的类型。
第2列,是操作符的名字字符串。
第3列,是运算优先级。
小括号表示的表达式,优先级最高的,语句的优先级最低。先乘除,后加减。