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

编译原理 实验3 递归下降语法分析程序设计实验目的】练习构造递归下降语法分析程序的方法,熟悉上下文无关文法的使用,加深对课堂教学的理解;提高语法分析方法的实践能力【实验要求】利用某一高级程序设计语言构造语法分析程序【具体要求】对于给定的文法G[E]E->TE’E’->+TE’|εT->F…

大家好,又见面了,我是你们的朋友全栈君。

实验目的】

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

【实验要求】

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

【具体要求】对于给定的文法G[E]

              E->TE’

             E’->+TE’ | ε

            T->FT’

            T’->*F T’| ε

            F->(E) | i

     采用递归下降语法分析法编写语法分析程序,该语法分析程序判断输入的字符串是否符合上述文法,并能够输出相应的结果(是语法成分或不是语法成分)。

 

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

 

上面一版有个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);
    }
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149859.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Qt多线程实例与connect第五个参数[通俗易懂]

    Qt是一个GUI框架,在GUI程序中,主线程也叫GUI线程,因为它是唯一被允许执行GUI相关操作的线程。对于一些耗时的操作,如果放在主线程中,就是出现界面无法响应的问题。解决方法一:在处理耗时操作中频繁调用QApplication::processEvents()。这个函数告诉Qt去处理那些还没有被处理的各类事件,然后再把控制权返还给调用者。QElapsedTimeret;…

    2022年4月8日
  • tpshop带微分销_TPshop微分销商城有什么作用[通俗易懂]

    tpshop带微分销_TPshop微分销商城有什么作用[通俗易懂]TPshop微分销商城有什么作用?据你所了解的有多少?一、可以简化商品的购物流程我们都知道的是在实体店进行购买的时候,我们可以直接看到商品,并且能够摸到产品的质量如何,并且在最后,假如并不合适的时候,是可以找商家进行退还的,但是网上购买就有所不同,有的时候还有些复杂,所以微商分销商品也着力于这一点进行考虑。适当的简化了商品的购物流程,让整个购物旅程更加美好。二、通过这一点吸引了浩繁的粉丝进行了最低…

    2022年5月16日
  • java的逻辑运算符_Java语言用条件运算符编程模板

    java的逻辑运算符_Java语言用条件运算符编程模板Java条件运算符条件运算符属于三目运算符,它的语法结构是:布尔表达式?表达式1:表达式2。它的运行原理是这样的,先判断布尔表达式的结果是true还是false,如果是true,则选择表达式1的结果作为整个表达式的结果,反之则选择表达式2的结果作为整个表达式的结果。来看一段代码:publicclassConditionalOperatorTest01{publicstaticvoidm…

    2022年10月2日
  • OutputStreamWriter 源码分析

    OutputStreamWriter 源码分析字符流通向字节流的桥梁:可使用指定的charset将要写入流中的字符编码成字节。为了获得最高效率,可考虑将OutputStreamWriter包装到BufferedWriter中,以避免频繁调用转换器。例如:Writerout=newBufferedWriter(newOutputStreamWriter(System.out));[code="j…

    2022年9月11日
  • 有关QueryInterface函数

    有关QueryInterface函数一,QueryInterface函数原型:HRESULT __stdcall QueryInterface(const IID&iid,void**ppv);iid:标志客户所需的接口。是”一个接口标志符“结构(IID)。ppv:QueryInterface用来存放所请求接口的地址。返回值:可以返回S_OK或E_NOINTERFACE应该用SUCEEDED或者FAILED宏验证

    2022年6月22日
  • Parallel.ForEach 使用多线程遍历循环

    Parallel.ForEach 使用多线程遍历循环原地址路径:https://www.cnblogs.com/personblog/archive/2019/10/09/11640801.htmlParallel.ForEach相对于foreach是多线程,并行操作;foreach是单线程循环操作。staticvoidMain(string[]args){Console.WriteLine(“HelloWorld!”);List<UserInfo>lst=n

    2022年7月19日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号