#include<iostream>

#include<cstring>

#include<cstdio>

#include<algorithm>

#include<stack>

using namespace std;

///表格数组                a       b        c       d       #      E      A       B

char LR0[50][50][100] = {{"S2"  ,"S3"   ,"null", "null" ,"null" ,"1"    ,"null" ,"null"},///   0

{"null" ,"null" ,"null", "null" ,"acc " ,"null" ,"null" ,"null"},///   1

{"null" ,"null" ,"S4"  , "S10"  ,"null" ,"null" ,"6"    ,"null"},///   2

{"null" ,"null" ,"S5"  , "S11"  ,"null" ,"null" ,"null" ,"7"   },///   3

{"null" ,"null" ,"S4"  , "S10"  ,"null" ,"null" ,"8"    ,"null"},///   4

{"null" ,"null" ,"S5"  , "S11"  ,"null" ,"null" ,"null" ,"9"   },///   5

{"r1"  ,"r1"   ,"r1"  , "r1"   ,"r1"   ,"null" ,"null" ,"null"},///   6

{"r2"  ,"r2"   ,"r2"  , "r2"   ,"r2"   ,"null" ,"null" ,"null"},///   7

{"r3"  ,"r3"   ,"r3"  , "r3"   ,"r3"   ,"null" ,"null" ,"null"},///   8

{"r5"  ,"r5"   ,"r5"  , "r5"   ,"r5"   ,"null" ,"null" ,"null"},///   9

{"r4"  ,"r4"   ,"r4"  , "r4"   ,"r4"   ,"null" ,"null" ,"null"},///   10

{"r6"  ,"r6"   ,"r6"  , "r6"   ,"r6"   ,"null" ,"null" ,"null"},///   11

};

char L[200]="abcd#EAB";    ///列判断依据

int  del[10]={0,2,2,2,1,2,1};//0-6号文法每个文法长度

char head[20]={'S','E','E','A','A','B','B'};

stack<int>con;    ///状态栈

stack<char>cmp;   ///符号栈

char cod[300]="0";///初始状态栈对应输出数组

int cindex = 0;

char sti[300]="#";///初始符号栈对应输出数组

int sindex = 0;

int findL(char b)///对应列寻找

{

for(int i = 0; i <= 7; i++)

{

if(b==L[i])

{

return i;

}

}

return -1;

}

void error(int x, int y)       ///报错输出

{

printf("第%d行%c列为空!",x,L[y]);

}

int calculate(int l, char s[])//计算移入或者归约的数字

{

int num = 0;

for(int i = 1; i < l; i ++)

{

num =  num*10+(s[i]-'0');//s[i]-'0'的值为 s[i]字符的ASCII码值

}

return num;

}

void analyze(char str[],int len)///分析主体过程,第一个参数为要分析的字符串,第二个参数为字符串长度

{

int cnt = 1;

printf("步骤      状态栈    符号栈    输入串    ACTION    GOTO\n");

int LR = 0;

while(LR<=len)//还没有分析到结尾

{

printf("(%d)       %-10s%-10s",cnt,cod,sti);///步骤,状态栈,符号栈输出

cnt++;

for(int i = LR; i < len; i++)///输入串输出,只输出目前没有分析的部分

{

printf("%c",str[i]);

}

for(int i = len-LR; i<10;i++)printf(" ");

int x = con.top();///状态栈栈顶

int y = findL(str[LR]);///待判断串串首

if(strcmp(LR0[x][y],"null")!=0)// LR0[x][y]的值不为空

{

int l = strlen(LR0[x][y]);///当前Ri或Si的长度

if(LR0[x][y][0]=='a')///acc

{

printf("acc        \n");///ACTION与GOTO

return ;

}

else if(LR0[x][y][0]=='S')///Si,移进

{

printf("%-10s \n",LR0[x][y]);///ACTION与GOTO

int t = calculate(l,LR0[x][y]);//计算移入的是状态几的操作

con.push(t); //将移入的状态入栈

sindex++;//符号栈指针加1

sti[sindex] = str[LR];//新字符移入符号栈

cmp.push(str[LR]);

if(t<10)

{

cindex++;

cod[cindex] = LR0[x][y][1];//输出状态栈,移入几

}

else //t是两位数

{

int k = 1;

cindex++;

cod[cindex] = '(';

while(k<l)

{

cindex++;

cod[cindex] = LR0[x][y][k];

k++;

}

cindex++;

cod[cindex] = ')';

}

LR++;

}

else if(LR0[x][y][0]=='r')///ri,退栈,ACTION和GOTO

{

printf("%-10s",LR0[x][y]);

int t = calculate(l,LR0[x][y]);

int g = del[t];//要回退多少个符号

while(g--)

{

con.pop();

cmp.pop();

sti[sindex] = '\0';

sindex--;

}

g = del[t];

while(g>0)

{

if(cod[cindex]==')')

{

cod[cindex]='\0';

cindex--;

for(;;)

{

if(cod[cindex]=='(')

{

cod[cindex]='\0';

cindex--;

break;

}else

{

cod[cindex]='\0';

cindex--;

}

}

g--;

}else

{

cod[cindex] = '\0';

cindex--;

g--;

}

}///

cmp.push(head[t]);

sindex++;

sti[sindex] = head[t];

x = con.top();

y = findL(cmp.top());

t = LR0[x][y][0]-'0';

con.push(t);

cindex++;

cod[cindex] = LR0[x][y][0];

printf("%-10d\n",t);

}else

{

int t = LR0[x][y][0]-'0';

char ch = ' ';

printf("%-10c%-10d\n",ch,t);

con.push(t);

cindex++;

cod[cindex] = LR0[x][y][0];

sindex++;

sti[sindex] = 'E';

LR++;

}

}else//当前状态为空,出错处理

{

error(x,y);

return ;

///报错

}

}

}

void chart()///测试表函数

{

printf("-\ta\tb\tc\td\t#\tE\tA\tB\n");

for(int i = 0; i <= 11; i++)

{

printf("%d",i);

for(int j = 0 ; j <= 8; j++)

printf("\t%s",LR0[i][j]);

cout<<endl;

}

cout<<endl;

}

int main()

{

chart();//先构造分析表

con.push(0);//0进入状态栈

cmp.push('#');//#句首符号进入状态栈

char str[200];///输入串

cout<<"请输入字符串(带#):"<<endl;

cin>>str;

int len = strlen(str);

analyze(str,len);

return 0;

}

来了一个人的时候我就不想吃东西的相关推荐

  1. 从言行合一到知行合一

    本篇记录突然的随想,偶尔停留 2022-01-17 rest不只是一个简单的api约束分享一本rest小手册,如何把东西变得 RESTful! 2021-12-06 规划 未来编程.   未来需要什么 ...

  2. 总结一下在使用某里云服务器的过程中出现过的一些问题

    此文总结在使用阿里云的过程中出现过的问题   想起来就记录一下 本人为言行负责! 海内选择腾讯华为,共勉! k8s不同命名空间的配置文件串掉了 k8s集群服务器购买上后,无法使用外网.连续购买了4台然 ...

  3. 程序主动进行电话短信报警,自定义电话、短信、钉钉报警通知

    程序主动进行电话短信报警,自定义电话.短信.钉钉报警通知 一. 规则说明 这里我们要利用到阿里云的云监控的手段,有一个叫做事件监控的东西,可以通过自定义事件上传来进行监控报警. 流程: 程序发现错误 ...

  4. 2021-10-27 我与地坛

    2021-10-27 我与地坛 要是有些事我没说,地坛,你别以为是我忘了,我什么也没忘,但是有些事只适合收藏.不能说,也不能想,却又不能忘.它们不能变成语言,它们无法变成语言,一旦变成语言就不再是它们 ...

  5. 系统架构升级要不要上微服务?历“久”弥新微服务——你真的需要升级微服务架构吗

    在 <微服务架构设计模式> 一书中,作者总结了关于微服务的一些"重点",原文如下: 中国企业和开发者对微服务架构的热情让我印象深刻.但如同我给所有客户的忠告一样,我想对 ...

  6. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法

    数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...

  7. zip压缩多个文件,解压时不包含目录层级

    假设我们有个目录叫 dev,dev中有很多文件,我们想要将dev中的文件打包,名字可能叫dev.zip,但当我们解压的时候,不想要解压生成一个dev目录,想要直接解压在当前目录,这样如何压缩呢? # ...

  8. Docker容器的备份与恢复,Docker镜像的备份与恢复

    1. 备份容器 首先,为了备份Docker中的容器,我们会想看看我们想要备份的容器列表.要达成该目的,我们需要在我们运行着Docker引擎,并已创建了容器的Linux机器中运行 docker ps 命 ...

  9. OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3

    OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...

  10. 恭喜你发现了宝藏,编程习惯-日积月累

    总结: 条件查询可在数据库层创建queryDto进行统一操作. 代码复用:若有代码重复出现了三次,很大概率可以重构.(三则重构) dto和entity中的赋值操作,可以写成方法放在dto中.(充血模型 ...

最新文章

  1. 中科院自动化所介绍深度强化学习进展:从AlphaGo到AlphaGo Zero
  2. 云视通手机录像存储在什么地方_抖音影视剪辑抽帧是什么意思
  3. 关于有限自动机的一篇不错的文章
  4. 陶陶的兔二,建好啦!
  5. 用Starlink填补5G和光纤之间的空白
  6. mysql查询时间段内的数据
  7. java socket数据传输_Java Socket编程(一) Socket传输模式
  8. 线程池是如何执行的?拒绝策略有哪些?
  9. 如何在单例模式下禁止init
  10. Wavegrove Maji+ for Mac - 饱和压缩器插件
  11. 如何使用notepad++查看二进制bin文件
  12. comsol入门闲聊
  13. 使用Python-OpenCV将图片批量转换为jpg格式
  14. 山东教师教育网-404、登录、密码找回、常见问题、绑定已有账户
  15. js制作倒计时,天,小时,分,秒
  16. 服务器连接异常系统无法登录,Win10系统电脑无法登录LOL提示服务器连接异常的原因及解决方法...
  17. 印度公开病患接触者追踪应用源代码
  18. 支付宝app支付功能-服务端的实现-python3版
  19. kingcms php 标签,MySQL_KingCMS广告标签的使用方法,KINGCMS在3.0的时候我用过,可以 - phpStudy...
  20. java调用QQ邮箱发送邮件

热门文章

  1. 2011年5月19日
  2. Spring 注入方式
  3. 进军智能制造,软通动力的“三板斧”
  4. 搭建服务器部署聊天机器人记录
  5. cmd中查看python安装路径
  6. 英特尔傲腾技术从三方面助您成功部署超融合基础设施
  7. 为毛老抱怨工资低又不离职
  8. 项目案例——个人博客网站
  9. Shell 编程入门
  10. canvas 文字超出显示省略号