大家好,又见面了,我是你们的朋友全栈君。
实验目的】
练习构造递归下降语法分析程序的方法,熟悉上下文无关文法的使用,加深对课堂教学的理解;提高语法分析方法的实践能力
【实验要求】
利用某一高级程序设计语言构造语法分析程序
【具体要求】对于给定的文法G[E]
E->TE’
E’->+TE’ | ε
T->FT’
T’->*F T’| ε
F->(E) | i
采用递归下降语法分析法编写语法分析程序,该语法分析程序判断输入的字符串是否符合上述文法,并能够输出相应的结果(是语法成分或不是语法成分)。
上面一版有个bug当输入 i)会提示正确
下面做了修改, 第29-35行,可能还有其他错误,欢迎留言。
/*
实验名称:实验3 递归下降语法分析程序设计
学号:
姓名:niu91(859222829)
班级:
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char str[10];
int index = 0;
void E(); // E->TX;
void X(); // X->+TX | e
void T(); // T->FY
void Y(); // Y->*FY | e
void F(); // F->(E) | i
int main() {
int len;
int m;
printf("请输入要测试的次数:");
scanf("%d", &m);
while (m--) {
printf("请输入算数表达式:");
scanf("%s", str);
len = strlen(str);
str[len] = '#';
str[len + 1] = '/*
实验名称:实验3 递归下降语法分析程序设计
学号:
姓名:niu91(859222829)
班级:
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char str[10];
int index = 0;
void E(); // E->TX;
void X(); // X->+TX | e
void T(); // T->FY
void Y(); // Y->*FY | e
void F(); // F->(E) | i
int main() {
int len;
int m;
printf("请输入要测试的次数:");
scanf("%d", &m);
while (m--) {
printf("请输入算数表达式:");
scanf("%s", str);
len = strlen(str);
str[len] = '#';
str[len + 1] = '\0';
E();
//<< 2020年12月15日 fixbug:: i)
if (str[index] == '#')
printf("正确语句!\n");
else {
printf("分析失败!\n");
}
//>>
strcpy(str, "");
index = 0;
}
return 0;
}
void E() {
T();
X();
}
void X() {
if (str[index] == '+') {
index++;
T();
X();
}
}
void T() {
F();
Y();
}
void Y() {
if (str[index] == '*') {
index++;
F();
Y();
}
}
void F() {
if (str[index] == 'i') {
index++;
} else if (str[index] == '(') {
index++;
E();
if (str[index] == ')') {
index++;
} else {
printf("分析失败!\n");
exit(0);
}
} else {
printf("分析失败!\n");
exit(0);
}
}
';
E();
//<< 2020年12月15日 fixbug:: i)
if (str[index] == '#')
printf("正确语句!\n");
else {
printf("分析失败!\n");
}
//>>
strcpy(str, "");
index = 0;
}
return 0;
}
void E() {
T();
X();
}
void X() {
if (str[index] == '+') {
index++;
T();
X();
}
}
void T() {
F();
Y();
}
void Y() {
if (str[index] == '*') {
index++;
F();
Y();
}
}
void F() {
if (str[index] == 'i') {
index++;
} else if (str[index] == '(') {
index++;
E();
if (str[index] == ')') {
index++;
} else {
printf("分析失败!\n");
exit(0);
}
} else {
printf("分析失败!\n");
exit(0);
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149859.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...