语法规则的书写
通过前面的学习,我们已经知道语法规则是使用 上下文无关文法 来表示的。而 上下文无关文法 是由一组 替换规则(又叫产生式)组成的。具体看看下面的形式:
add -> mul | add + mul
mul -> pri | mul * pri
pri -> Id | Num | (add)
- add -> mul | add + mul :加法表达式add可以替换成一个 乘法表达式mul ,或者替换成一个 加法表达式add 加上一个 乘法表达式mul。
- mul -> pri | mul * pri : 乘法表达式mul 可以替换成一个 基础表达式pri ,或者替换成一个 乘法表达式mul 乘上一个 基础表达式pri。
- pri -> Id | Num | (add) :基础表达式pri 可以替换成一个 数字字面量Num,或者一个 变量 Id,或者一个 括号带上加法表达式(add)。
对于 “2+3*5”,算术表达式的推导过程为例:
通过上图的推导过程,我们可以清楚地看到这两个表达式是怎样生成的。而分析过程中形成的这棵树,其实就是 AST。我们通过观察发现,上图中的的叶子节点都是一个一个 Token,如 “*”,“+”,还有 Num数字字面量。这些叶子节点称为 终结符,而那些非叶子节点称为 非终结符,因为它还可以继续往下替换。