编译原理 实验2 语法分析——递归下降分析器

目录标题

  • 一、核心代码
    • 1.题目要求
    • 2.代码实现
    • 3.运行结果:
  • 二、实现加,减,乘,除运算的表达式文法
    • 1.题目要求
    • 2.代码实现
    • 3.运行结果

一、核心代码

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 
#include 
#include 
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.运行结果:

编译原理 实验2 语法分析——递归下降分析器_第1张图片

以上转自 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 
#include 
#include 
#include 
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行之后由于分析串太长 导致对不齐)
编译原理 实验2 语法分析——递归下降分析器_第2张图片

你可能感兴趣的:(编译原理 实验2 语法分析——递归下降分析器)