编译原理 实验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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ureport2 mysql_springboot整合UReport2「建议收藏」

    ureport2 mysql_springboot整合UReport2「建议收藏」###1、首先新建一个springboot项目###可以用idea直接新建,也可以在spring-boot官方提供的生成器生成项目,生成地址是:[https://start.spring.io/][https_start.spring.io]###2、配置pom.xml###org.springframework.bootspring-boot-starter-jdbcmysqlmysql…

    2022年10月25日
  • binder原理和实现机制(金属强化机制及其强化原理)

    参考自大神https://zhuanlan.zhihu.com/p/35519585参考自大神https://blog.csdn.net/carson_ho/article/details/73560642一前言二Linux传统的进程间通信原理简述2.1Liunx中跨进程通信主要有三个关键信息2.2Linux下的传统IPC通信原理三Binder跨进程通信原理四…

    2022年4月11日
  • aliddns ipv6_Python实现阿里云域名DDNS支持ipv4和ipv6-阿里云开发者社区

    aliddns ipv6_Python实现阿里云域名DDNS支持ipv4和ipv6-阿里云开发者社区前言然后你的IP必须是公网IP,不然解析了也没用。本文章讲怎样通过阿里云的SDK来添加修改域名解析,检查本机IP与解析的IP是否一致,不一致自动修改解析,达到动态解析的目的,主要用于家庭宽带这些动态IP的地方。安装阿里云SDK和其他第三方库pipinstallaliyun-python-sdk-core-v3pipinstallaliyun-python-sdk-domainpipins…

    2022年5月30日
  • VLAN标签「建议收藏」

    VLAN标签「建议收藏」1.VLAN标签定义和作用要使交换机能够分辨不同的VLAN报文,需要在报文中添加标识VAN信息的字段。IEEE802.1Q协议规定在以太网数据帧的目的MAC地址和源MAC地址字段之后、协议类型字段之前加入4个字节的VLAN标签(又称VLANTag,简称Tag),用以标识VLAN信息,IEEE802.1Q封装的VLAN数据帧格式如图所示。2.常用设备收发数据帧的VLAN标签情况…

    2022年8月10日
  • 简单的激光干涉测距仪原理——为什么只能测量相对距离「建议收藏」

    简单的激光干涉测距仪原理——为什么只能测量相对距离「建议收藏」为什么要用激光来测量距离呢?这一切都是因为激光的波长很短,同频率的光波叠加会在波长级的尺度上产生周期性的变化,因此用激光测量距离时,精度是波长级别的,这也是为什么通常选用波长较短的激光进行测距。将同一光束分成两束,其中一束状态不变,另一束经物体反射后与第一束合并,以光电探测器进行探测。物体每移动半个波长,探测器探测到的信号就会出现一个极值,通过数极值的数量就可以知道物体移动了多少。…

    2022年5月22日
  • linux tcptraceroute tcpping安装使用

    linux tcptraceroute tcpping安装使用1.首先安装依赖包libpcapyuminstall-ylibpcap2.下载tcptracerouterpm包,并安装rpm-ivhtcptraceroute-1.5-0.beta7.el6.rf.x86_64.rpmtcptraceroute121.46.29.1155810-n-q1tracerouteto121….

    2022年6月20日

发表回复

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

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