语法分析程序设计
一、递归下降分析器
1.实验目的:通过设计、编制、调试递归下降语法分析程序,对输入的符号串进行分析匹配,观察输入符号串是否为给定文法的句子。
2.实验内容:递归下降分析法是一种自顶向下的分析方法,文法的每个非终结符对应一个递归过程(函数)。分析过程就是从文法开始符出发执行一组递归过程(函数),这样向下推导直到推出句子;或者说从根节点出发,自顶向下为输入串寻找一个最左匹配序列,建立一棵语法树。
在不含左递归和每个非终结符的所有候选终结首字符集都两两不相交条件下,我们就可能构造出一个不带回溯的自顶向下的分析程序,这个分析程序是由一组递归过程(或函数)组成的,每个过程(或函数)对应文法的而一个非终结符。这样的一个分析程序称为递归下降分析器。 文法G(E)为:G[E]:E -> E+T | T
T -> T*F | F F -> (E) | i
3.实验要求:
(1)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i#
(2)输出结果:i+i*i#为合法符号串
(3)输入一符号串如i+i*#,要求输出为“非法的符号串”。 4.实验原理及流程图
递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一个非终结符号。每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的产生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。
无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。 无左递归:既没有直接左递归,也没有间接左递归。
无回溯:对于任一非终结符号U的产生式右部x1|x2|…|xn,其对应的字的首终结符号两两不相交。
如果一个文法不含回路(形如P?+ P的推导),也不含以ε为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以ε为右部的产生式)。 流程图:
5.结果截图:
6.源代码:
#define _CRT_SECURE_NO_WARNINGS #include
int main() {
printf(\请输入一个语句,以 # 号结束语句(直接输入#退出)\\n\); while (1) {
SIGN = 0; i = 0;
scanf(\, &s); if (s[0] == '#') return 0; E();
if (s[i] == '#')
printf(\合法语句!\\n\);
printf(\请输入一个语句,以 # 号结束语句 \\n\); }
return 1; }
void E() {
if (SIGN == 0) {
T(); E1(); } }
void E1() {
if (SIGN == 0) {
if (s[i] == '+') {
++i; T(); E1(); }
else if (s[i] != '#'&&s[i] != ')') {
printf(\非法语句\\n\); SIGN = 1; } } }
void T() {