一、核心代码
1.题目要求
练习构造递归下降语法分析程序的方法,熟悉上下文无关文法的使用,加深对课堂教学的理解;提高语法分析方法的实践能力
文法 G[E]:
E→E+T|T
T→T*F|F
F→i|(E)
消除左递归后:
E→TX
X→+TX|^
T→FY
Y→*FY|^
F→i|(E)
要求: 采用递归下降语法分析法编写语法分析程序,该语法分析程序判断输入的字符串是否符合上述文法,并能够输出相应的结果(是语法成分或不是语法成分)。
2.代码实现
#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();
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);
}
}
3.运行结果:
以上转自 https://blog.csdn.net/niu91/article/details/9155509
二、实现加,减,乘,除运算的表达式文法
1.题目要求
(1)给出不含左递归的,识别加,减,乘,除运算的表达式文法;
(2)采用递归下降分析方法编写识别所定义表达式文法的语法分析器;
(3)任意给出一个表达式句子,判断该表达式是否是合法的句子
文法 G[E]:
E→E+T|E-T|T
T→T*F|T/F|F
F→i|(E)
消除左递归后:
E→TX
X→+TX|-TX|^
T→FY
Y→*FY| /FY^
F→i|(E)
2.代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
char str[10];
int index = 0;
void E(); // E->TX;
void X(); // X->+TX|-TX|^
void T(); // T->FY
void Y(); // Y->*FY|/FY|^
void F(); // F->(E) | i
int count;
void rank();
void latter();
int m ,n;
int len;
void analyze();
void remain();
int main() {
int T;
printf("请输入要测试的次数:");
scanf("%d", &T);
while (T--) {
count = 0;m = -1,n = -1;index = 0;
printf("请输入算数表达式:");
scanf("%s", str);
len = strlen(str);
str[len] = '#';
printf("步骤\t 文法\t\t 分析串\t\t\t分析字符\t\t剩余串\n");
E();
if (str[index] == '#') printf("正确语句!\n");
else
printf("分析失败!\n");
}
return 0;
}
void E() {
rank();printf("E -> TX\t\t");analyze();latter();remain();
T();
X();
}
void X() {
if (str[index] == '+') {
rank(); printf("X ->+TX\t\t");m++;n++;analyze();latter();remain();
index++;
T();
X();
}
else if (str[index] == '-') {
rank(); printf("X ->-TX\t\t");m++;n++;analyze();latter();remain();
index++;
T();
X();
}
else{
rank();printf("X -> ^\t\t");analyze();latter();remain();}
}
void T() {
rank(); printf("T -> FY\t\t");analyze();latter();remain();
F();
Y();
}
void Y() {
if (str[index] == '*') {
rank();printf("Y ->*FY\t\t");m++;n++;analyze();
latter();remain();index++;
F();
Y();
}
else if (str[index] == '/') {
rank();printf("Y ->/FY\t\t");m++;n++;analyze();
latter();remain();index++;
F();
Y();
}
else{
rank();printf("Y -> ^\t\t");analyze();latter();remain();}
}
void F() {
if (str[index] == 'i')
{
rank();printf("F ->i\t\t");m++;n++;analyze();latter();remain();
index++;
}
else if (str[index] == '(')
{
rank();printf("F ->(E)\t\t"); m++;n++;analyze();latter();remain();
index++;
E();
if (str[index] == ')') {
rank();printf("F ->(E)\t\t");m++;n++;analyze();latter();remain();
index++;
}else {
printf("分析失败!\n");
exit(0);
}
}
else
{
printf("分析失败!\n");
exit(0);
}
}
void rank()
{
printf("%d\t",count);
count++;
}
void analyze()
{
if(m<0) cout<<' ';
else
{
for(int i = 0;i <= m;i++) cout<<str[i];
}
cout<<'\t'<<'\t'<<'\t';
}
void latter()
{
printf("%c",str[index]);
cout<<'\t'<<'\t'<<'\t';
}
void remain()
{
for(int j = n+1;j <= len;j++) cout<<str[j];
cout<<'\n';
}
3.运行结果
(代码本身没有问题滴 17行之后由于分析串太长 导致对不齐)