编译原理 实验3 递归下降语法分析程序设计

本文介绍了一个基于递归下降法的语法分析程序的设计与实现过程,该程序用于判断输入字符串是否符合特定的上下文无关文法。通过具体的代码示例展示了如何构造递归下降解析器,并对常见错误进行了修正。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验目的】

       练习构造递归下降语法分析程序的方法,熟悉上下文无关文法的使用,加深对课堂教学的理解;提高语法分析方法的实践能力

【实验要求】

    利用某一高级程序设计语言构造语法分析程序  

【具体要求】对于给定的文法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] = '\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);
    }
}

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值