本章我们将讲解递归下降的方法,并用它完成一个基本的四则运算的语法分析器。
什么是递归下降
传统上,编写语法分析器有两种方法,一种是自顶向下,一种是自底自上。自顶向下是从起始非终结符开始,不断地对非终结符进行分解,直到匹配输入的终结符;自底向上是不断地将终结符进行合并,直到合并成起始的非终结符。
其中的自顶向下方法就是我们所说的递归下降。
终结符与非终结符
没有学过编译原理的话可能并不知道什么是“终结符”,“非终结符”。这里我简单介绍一下。首先是BNF范式,就是一种用来描述语法的语言,例如,四则运算的规则可以表示如下:
<expr> ::= <expr> + <term>
| <expr> - <term>
| <term>
<term> ::= <term> * <factor>
| <term> / <factor>
| <factor>
<factor> ::= ( <expr> )
| Num
用尖括号<>括起来的就称作非终结符,因为它们可以用::=右侧的式子代替。|表示选择,如<expr>可以是<expr> + <term>、<expr> - <term>或<term>中的一种。而没有出现在::=左边的就称作终结符,一般终结符对应于词法分析器输出的标记。如果想一起交流的可以加这个群:941636044 ,有什么问题可以群里面交流,群里面也有一些方便学习C语言C++编程的资料可以给你利用哦!
四则运算的递归下降
例如,我们对3 * (4 + 2)进行语法分析。我们假设词法分析器已经正确地将其中的数字识别成了标记Num。
递归下降是从起始的非终结符开始(顶),本例中是<expr>,实际中可以自己指定,不指定的话一般认为是第一个出现的非终结符。
1. <expr> => <expr>