语法分析

源代码文本经过词法分析后,变成一串token。语法分析就是处理这串token,使之变成树状的token。这个树状的token就是AST。比如源代码文本

1 + 2 * 3

经过语法分析,变为
2023-12-04T09:21:41.png

后序遍历这颗树就可以求出这个表达式的值。
怎么构造这颗树呢?使用自顶向下算法。首先构造第一个表达式节点,然后遇到1构造一个1节点,作为第一个表达式的子节点。然后遇到+构造+号节点,也作为第一个表达式的子节点。后面要么是一个表达式,要么是一个数字,所以也构造一个表达式节点作为第一个表达式节点的子节点。然后遇到2,构造一个2节点,作为第二个表达式节点的子节点,然后遇到*号,构造一个*节点作为第二个表达式的子节点,然后遇到3,构造一个3节点,作为第二个表达式的子节点。

什么是表达式呢?假设expr表示表达式,并且expr只有加法和乘法,则有如下定义:

expr -> add
add -> mul | add + mul
mul -> literal | mul * literal
literal -> 0|1|2|3|4|5|6|7|8|9

上面的式子叫产生式,可以读作expr由add组成。add由mul或者add+mul组成。|表示或者。上面是一串规则,定义了表达式。
构造AST时,需要使用这个规则。