前言在之前完成了词法分析之后,得到了Token流,那么接下来就是实现语法分析器来输入Token流得到抽象语法树 (Abstract Syntax Tree,AST)。但是在完成这个语法分析器不像词法分析器,直接手撸就好了,还是需要一些前置的知识。 这些前置知识在之前的博文都有提起过
什么是语法分析?如果我们把词法分析看成是组合单词,输出单词流,那么语法分析就可以看作是检查这些单词是不是符合语法的过程。在词法分析的时候用正则或者手工比对来验证单词,语法分析则是用上下文无关文法 (context-free grammar,CFG)。
BNF范式
看一个例子:
其中S A B叫作非终结符,代表可以通过推导产生新的符号,之前在Token类里定义的也有这些非终结符;a b ε叫作终结符,表示其无法再通过推导产生新的符号了,ε则表示空; 上面的每一行就是一个产生式规则,也叫推导式,代表了一种非终结符的转移方式; S就是开始符号。 只有终结符的符号串称为句子 (sentence)。 比如通过这三个产生式,就可以断定bbb符合语法规则。 语法分析的几种方法
之前在学习的时候稍微记录了一下这几种方法,在这里就不说了 递归下降和LL(1)语法分析自底向上语法分析在这里稍微的再说一下这次语法分析使用的方法,LALR(1),它也属于自底向上的分析算法。 自底向上的语法分析
自底向上的语法分析需要一个堆栈来存放解析的符号,例如对于如下语法:
来解析1 2
此时规约到开始符号,并且输入串也为空,代表语法解析成功 所以实现自底向上的语法解析关键就是识别堆栈上是应该进行shift还是reduce操作。
小结所谓的前置知识其实也就是了解语法分析在干什么,和大概要怎么干。 语法分析就是检查输入的Token流是不是符合语法的过程,而完成这一步骤的语法分析算法,拿自底向上来说,也就是从叶子节点向上推导成树顶端的过程。 另外我的github博客:https:/// 来源:https://www./content-4-394851.html |
|