表达式语法分析——递归子程序法

2023-05-16

 

表达式语法分析——递归子程序法

写在前面:切记不要删除代码部分对于函数的声明,以免造成error!!!通过函数的声明避免函数定义的先后顺序

递归子程序法是一种确定的自顶向下语法分析方法,要求文法是LL(1)文法。它的实现思想是对应文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选式时能够按LL(1)形式唯一地确定选择某个候选式进行推导。请根据下面的表达式LL(1)文法,构造递归子程序,完成对表达式的语法分析。

表达式文法如下:

    E→TG

    G→+TG | ε

    T→FS

    S→*FS | ε

    F→(E) | i


对于给定的输入串(长度不超过50个符号),请输出分析过程中用到的所有产生式,并指明该输入串是否为该文法能生成的表达式,输出共11行,前10行每行两个数据用空格隔开,表示推导时所用产生式顺序号(从0开始),最后一行是accept,表示i+i*i是文法能生成的合法表达式。注:其中&符号代表文法中的ε符号。
例如:

i+i*i是文法能生成的一个表达式,输出格式如下:

0 E-->TG

1 T-->FS

2 F-->i

3 S-->&

4 G-->+TG

5 T-->FS

6 F-->i

7 S-->*FS

8 F-->i

9 S-->&

10 G-->&

accept


i@i不是文法能生成的表达式,输出共5行,前5行每行两个数据用空格隔开,表示推导时所用产生式序号(从0开始),最后一行是error,表示i@i不是文法能生成的表达式。@不是合法的文法符号,输出格式举例:

0 E-->TG

1 T-->FS

2 F-->i

3 S-->&

4 G-->&

error

 

(i+i*i不是文法能生成的表达式,存在括号不匹配的语法错误,输出格式举例:

0 E-->TG

1 T-->FS

2 F-->(E)

3 E-->TG

4 T-->FS

5 F-->i

6 S-->&

7 G-->+TG

8 T-->FS

9 F-->i

10 S-->*FS

11 F-->i

12 S-->&

13 G-->&

error

Input

 

输入数据只有一行,代表待分析的符号串,以#号结束

Output

 

输出推导过程中所有的产生式,按照使用顺序给出。输出详细说明见题目描述中的例子。

Sample Input

i+i*i#

Sample Output

0 E-->TG
1 T-->FS
2 F-->i
3 S-->&
4 G-->+TG
5 T-->FS
6 F-->i
7 S-->*FS
8 F-->i
9 S-->&
10 G-->&
accept

Hint

 

Source

1.c++实现

#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>  //exit(0)函数头文件
using namespace std;
char str[100];
int num = 0;
int cur = 0;
 
void E();
void F();
void G();
void T();
void S();
 
void S(){
    if(str[cur] == '*'){
        printf("%d S-->*FS\n",num++);
        cur++;
        F();
        S();
    }else
        printf("%d S-->&\n",num++);
}
void G(){
    if(str[cur] == '+'){
        printf("%d G-->+TG\n",num++);
        cur++;
        T();
        G();
    }else
        printf("%d G-->&\n",num++);
}
void F(){
    if(str[cur] == 'i'){
        printf("%d F-->i\n",num++);
        cur++;
    }else if(str[cur] == '('){
        printf("%d F-->(E)\n",num++);
        cur++;
        E();
        if(str[cur] == ')'){
            cur++;
        }else{
            printf("error\n");
            exit(0);
        }
    }else{
            printf("error\n");
            exit(0);
    }
}
void T(){
    printf("%d T-->FS\n",num++);
    F();
    S();
}
void E(){
    printf("%d E-->TG\n",num++);
    T();
    G();
}
int main(){
    scanf("%s",str);
    E();
    if(str[cur]!='#')
        printf("error\n");
    else
        printf("accept\n");
    return 0;
}

2.c语言实现


#include<stdio.h>
char a[1000],b[1000];
int top=0,j,l;
int main()
{
    int i=0,j,n,m,k,t;
    char c[1000],ch;
    while(scanf("%c",&ch))
    {
        c[i++]=ch;
        if(ch=='#')
        {
            c[i++]='\0';
            break;
        }
    }
    a[top++]='E';
    for(j=0;top>0;)
    {
          if(a[top-1]=='E')
          {
              a[top-1]='G';
              a[top++]='T';
              printf("%d E-->TG\n",l++);
          }
          else if(a[top-1]=='G')
          {
              if(j>=i)
              {
                printf("%d G-->&\n",l++);
                 top--;
              }
             else if(c[j]=='+')
             {
                 j++;
                 a[top-1]='G';
                 a[top++]='T';
                 printf("%d G-->+TG\n",l++);
             }
             else
             {
                 printf("%d G-->&\n",l++);
                 top--;
             }
          }
          else if(a[top-1]=='T')
          {
              a[top-1]='S';
              a[top++]='F';
              printf("%d T-->FS\n",l++);
          }
          else if(a[top-1]=='S')
          {
              if(j>=i)
              {
                printf("%d S-->&\n",l++);
                 top--;
              }
              else if(c[j]=='*')
              {
                  j++;
                  a[top-1]='S';
                  a[top++]='F';
                  printf("%d S-->*FS\n",l++);
              }
              else
              {
                 printf("%d S-->&\n",l++);
                 top--;
              }
          }
          else if(a[top-1]=='F')
          {
              if(c[j]=='(')
                 {
                     j++;
                     a[top-1]=')';
                     a[top++]='E';
                     printf("%d F-->(E)\n",l++);
                 }
                 else if(c[j]=='i')
                 {
                     j++;
                     top--;
                     printf("%d F-->i\n",l++);
                 }
                 else
                 {
                     break;
                 }
          }
        else
        {
            if(a[top-1]==c[j])
            {
                top--;
                j++;
            }
            else
            break;
        }
        //printf("1\n");
    }
    if(top==0&&c[j]=='#')
    printf("accept\n");
    else
    printf("error\n");
}
  

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

表达式语法分析——递归子程序法 的相关文章

  • 【Cocos2d-x】使用贝塞尔曲线(Bezier)实现精灵抛物线运动

    Cocos2d x中的贝塞尔曲线 在Cocos2d x中贝塞尔曲线运动的封装类为CCBezierTo和CCBezierBy 这两个Action都需要传入一个参数ccBezierConfig xff0c 这是一个结构体 xff0c 这个结构体
  • 常用开源Jabber(XMPP) IM服务器介绍

    转自 xff1a http www kfdoc com Article kaifayuyan Java 200909 283 html 1 Openfire Wildfire 3 x 授权 GPL or 商用 操作系统平台 xff1a 所有
  • socket缓冲区大小设置

    系统提供的socket缓冲区大小为8K xff0c 你可以将之设置为64K xff0c 尤其在传输实时视频时 设置发送和接收缓冲区 int rcvbuf int rcvbufsize 61 sizeof int if getsockopt
  • CentOS 7 安装PostgreSQL

    原文 xff1a https blog csdn net wlwlwlwl015 article details 53256358 下载 在postgresql的官方即可找到源码文件目录 xff0c 地址如下 xff1a https www
  • 使用sudo apt-get update总是报错软件包缓存文件损坏

    命中 1 http cn archive ubuntu com ubuntu xenial InRelease 获取 2 http cn archive ubuntu com ubuntu xenial updates InRelease
  • CSP202112 第四题 磁盘文件操作(C++ 25分)

    使用了tuple xff0c 但这么使用的话 xff0c 只能符合前25 的数据 xff0c 即m小于等于10000 include lt bits stdc 43 43 h gt include lt tuple gt using nam
  • 安装Rust(Windows 10 与 CentOS7)

    注 xff1a 安装及下载需要科学上网 官网下载地址 xff1a Install Rust Rust Programming Language Window安装Rust 0 前提条件 安装C 43 43 编译工具 xff08 如下图所示 x
  • 【辅助驾驶】透视变换、仿射变换(包含鸟瞰图、俯视图、正视图)[3]——汽车全景环视系统

    一 效果 4个不同方向的相机 xff0c 将其鸟瞰变化后 xff0c 进行拼接 xff0c 得到车辆及周围区域的鸟瞰视角图 二 处理流程 1 相机的标定和图片校正 xff1b 2 图像拼接 xff1b 3 拼接缝消除 xff1b 4 移植到
  • 玩客云刷Armbian详细教程

    网上放出了很多关于玩客云的刷机玩法 xff0c 有电视盒子 复古游戏机 Armbian Linux操作系统搭建自己的私有云 可玩性还是很高的 xff0c 而且价格还便宜就入手了一台 下面记录一下我的玩客云折腾之旅 xff0c 机器刷了Arm
  • 原创分析| 入门或者转行音视频,应该要怎么做?

    要不要从事音视频开发 这一两年因为该死的疫情 xff0c 让短视频 超高清视频和实时音视频反而成为需求风口 我的看法当然是觉得音视频这个行业还可以 xff0c 而且从我自己的观察来看 xff0c 做音视频的现在普遍年龄都在 30 43 了
  • while(a<b<c)怎么理解?

    首先计算a lt b 是否成立 xff0c 再计算1 lt c或 0 lt c span class hljs keyword int span main span class hljs keyword int span a 61 span
  • C判断字符输入是否为指定字符串

    题目要求 xff1a 设定口令为 yulingxi 请求输入 xff0c 如果错误循环输入直至正确为止 1 xff0c 偷懒用strcmp 的做法 xff1a span class hljs preprocessor define CRT
  • 犀哥教你用C写贪吃蛇

    一 xff0c 涉及知识点 xff1a 结构体链表 xff0c 动态分配内存 xff0c 键盘输入检测 xff0c 设置光标 二 xff0c 实现逻辑 1 xff0c 可以设置光标 xff0c 就能实现制定位置打印制定符号 2 xff0c
  • C++类的默认继承方式为保护继承

    二义性 xff1a 就是指取值不明确 xff0c 比如下面例子中的D3同时继承与父类D1 D2 而两个父类当中都有成员变量k 此时如果想要用D3的对象 xff0c 访问父类的成员变量K xff0c 则需要加上相应的域名才能访问 并且只有在继
  • 学习笔记(三) 解决Python3.X pycharm中报No module named 'PIL'

    PIL全称Python Imaging Library xff0c 翻译过来就是Python图像处理库 如果报了标题的错误 xff0c 说明在程序涉及图片时少了这个库 解决方法很简单 xff1a 打开命令行 xff1a pip instal
  • 解释一下为啥负数的取值范围比整数要多一个

    这里有一个0值的差别 以最简单的单字节char型为例 占8位 xff0c 最高位为符号位 这样0值就有了 0000 0000 正零 1000 0000 负零 两种 从数学角度上 xff0c 是没区别的 xff0c 可是用两种形式表示一个数
  • 位运算符打印补码的问题

    int a i scanf d amp a getchar char data 61 1 lt lt 7 for i 61 0 i lt 8 i 43 43 data amp a putchar 1 putchar 0 a lt lt 61
  • socket网络编程的一些基础知识

    目录 xff1a 1 什么是套接字 xff1f 2 Internet 套接字的两种类型 3 网络理论 4 结构体 5 本机转换 6 IP 地址和如何处理它们 7 socket 函数 8 bind 函数 9 connect 函数 10 lis
  • JS如何处理超过32位的整数的位运算

    这个问题是已经毕业的学员李佳问到的 本想在网上查一下给他个答案省事 转念一想 如果网上如果他能在网上查到看的明白的方案应该不至于来问我 索性自己给他解一解 因为貌似这个问题还是有点意思的 首先 要知道为什么这个问题会成为一个问题 这里就不得

随机推荐

  • OpenStack环境部署

    这里写目录标题 虚拟机资源信息部署思路资源规划基础环境配置关闭防火墙和系统按群机制 xff0c 修改主机名安装基础环境依赖包VMnet1网卡配置参数 配置主机映射文件三台节点做免交互配置DNS xff0c 配置控制节点时间同步 系统环境配置
  • Mac OSX 打开原生自带读写NTFS功能[10.11.6 work, 10.14.4不work]

    文章目录 一 放开mac的Rootless机制二 查看磁盘的Volume Name三 更改 etc fstab文件四 做快捷方式五 隐藏桌面移动硬盘快捷方式 xff0c 拖入Finder边栏环境 最近买了一个移动硬盘 xff0c 发现在ma
  • 01. Ubuntu下安装nvidia显卡驱动(安装方式简单)

    文章目录 第一步 获取显卡型号第二步 查看GTX970M显卡驱动第三步 查询支持GTX970M显卡的显卡驱动的其他驱动版本第四步 安装第五步 测试nvidia driver是否安装成功环境参考资料 Ubuntu下安装nvidia显卡驱动 x
  • 动态规划——木棍加工

    题目链接 题目描述 一堆木头棍子共有n根 xff0c 每根棍子的长度和宽度都是已知的 棍子可以被一台机器一个接一个地加工 机器处理一根棍子之前需要准备时间 准备时间是这样定义的 xff1a 第一根棍子的准备时间为1分钟 xff1b 如果刚处
  • NodeBB论坛搭建

    NodeBB是一个开源的Node js论坛 xff0c 下面记录下搭建过程 基于Centos7 64位操作系统 xff1a 1 关闭SELinux vim etc sysconfig selinux 2 安装MongoDB 2 1 新建文件
  • centos 卸载mysql

    1 通过rpm命令卸载 查询已安装的mysql组件 rpm qa grep i mysql 卸载上一步查询到的组件 rpm qa grep i 具体的组件 rpm ev nodeps mysql community release el7
  • 【C/C++】C语言复制字符串及复制函数汇总(strcpy()/memcpy()/strncpy()/memmove())

    目录 strcpy 举例 xff1a memcpy 举例 xff1a strncpy 举例 xff1a memmove 举例 xff1a 我们首先来考虑一个简单的问题 xff0c 我们定义了一个字符串 xff0c 然后想要复制这个字符串 x
  • 打不开MicrosoftStore用命令在Win10安装Ubuntu1804

    用Azure Function APP部署Python接口 xff0c 但只支持Linux 公司有部机装了Linux xff0c 但在恶心猥琐男手上 只好在自己电脑装个Linux系统 xff0c 教程大都是从Microsoft Store安
  • 深度学习【62】旋转不变性人脸检测PCN

  • linux记录(一个全新的环境)安装miniconda3

    查看Linux的版本 lsb release a 想要安装miniconda xff0c 但是显示没有wget 所以先安装weget apt get install y wget 运行了以后报错 xff0c 显示没有安装wget xff0c
  • java键盘输入

    import java util Scanner 引入函数 public class Helloworld public static void main String args TODO Auto generated method stu
  • python学习

    coding utf 8 34 34 34 Spyder Editor This is a temporary script file 34 34 34 a 61 4 b 61 3 print a 43 b a 61 39 ccv 39 p
  • 高数Umaru系列(9)——哈士奇

    高数Umaru系列 xff08 9 xff09 哈士奇 Time Limit 1000 ms Memory Limit 65536 KiB Problem Description 由于高数巨养的喵星人太傲娇了 xff0c 要天天吃新鲜猫粮而
  • python 去除空格

    usr bin env python3 coding utf 8 39 39 39 去除多余的空格 39 39 39 string 61 34 My name is hyaden 34 print string str list 61 st
  • 简单的代码生成程序

    简单的代码生成程序 通过三地址代码序列生成计算机的目标代码 在生成算法中 对寄存器的使用顺序为 寄存器中存有 gt 空寄存器 gt 内存中存有 gt 以后不再使用 gt 最远距离使用 Input 单组输入 给定输出的三地址代码的个数和寄存器
  • DAG优化

    DAG优化 Problem Description 大家都学过了代码优化 xff0c 其中有一个DAG优化 xff0c 这次我们就练习这个操作 Input 输入第一行为一个整数 xff4e n lt 100 xff0c 表示该组输入的表达式
  • 翻译布尔表达式

    翻译布尔表达式 这是用c 43 43 实现的布尔表达式 Problem Description 大家都学过了布尔表达式的翻译 xff0c 其中有一个拉链 xff0d 回填技术 xff0c 这次我们就练习这个技术 Input 多组输入 xff
  • docker命令大全以及常用写法举例

    内容来自公众号赫连小伍 xff0c 转载请注明出处 login xff1a 登录到远程仓库search xff1a 从远程仓库搜索镜像push xff1a 把本地镜像推送到远程仓库pull xff1a 从远程仓库拉取或更新镜像images
  • 虚拟机安装UOS系统--(仅命令行版)图文详解

    UOS 由深度操作系统deepin为基础 xff0c 经过定制而来的产品 考虑到后者是基于 Linux 的国产操作系统的一员 xff0c UOS 应该拥有相同的定位 UOS 拥有 家庭版 专业版 服务器版 三个分支 xff0c 个人版不再更
  • 表达式语法分析——递归子程序法

    表达式语法分析 递归子程序法 写在前面 xff1a 切记不要删除代码部分对于函数的声明 xff0c 以免造成error xff01 xff01 xff01 通过函数的声明避免函数定义的先后顺序 递归子程序法是一种确定的自顶向下语法分析方法