来了一个人的时候我就不想吃东西的
#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;
}
来了一个人的时候我就不想吃东西的相关推荐
- 从言行合一到知行合一
本篇记录突然的随想,偶尔停留 2022-01-17 rest不只是一个简单的api约束分享一本rest小手册,如何把东西变得 RESTful! 2021-12-06 规划 未来编程. 未来需要什么 ...
- 总结一下在使用某里云服务器的过程中出现过的一些问题
此文总结在使用阿里云的过程中出现过的问题 想起来就记录一下 本人为言行负责! 海内选择腾讯华为,共勉! k8s不同命名空间的配置文件串掉了 k8s集群服务器购买上后,无法使用外网.连续购买了4台然 ...
- 程序主动进行电话短信报警,自定义电话、短信、钉钉报警通知
程序主动进行电话短信报警,自定义电话.短信.钉钉报警通知 一. 规则说明 这里我们要利用到阿里云的云监控的手段,有一个叫做事件监控的东西,可以通过自定义事件上传来进行监控报警. 流程: 程序发现错误 ...
- 2021-10-27 我与地坛
2021-10-27 我与地坛 要是有些事我没说,地坛,你别以为是我忘了,我什么也没忘,但是有些事只适合收藏.不能说,也不能想,却又不能忘.它们不能变成语言,它们无法变成语言,一旦变成语言就不再是它们 ...
- 系统架构升级要不要上微服务?历“久”弥新微服务——你真的需要升级微服务架构吗
在 <微服务架构设计模式> 一书中,作者总结了关于微服务的一些"重点",原文如下: 中国企业和开发者对微服务架构的热情让我印象深刻.但如同我给所有客户的忠告一样,我想对 ...
- 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法
数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...
- zip压缩多个文件,解压时不包含目录层级
假设我们有个目录叫 dev,dev中有很多文件,我们想要将dev中的文件打包,名字可能叫dev.zip,但当我们解压的时候,不想要解压生成一个dev目录,想要直接解压在当前目录,这样如何压缩呢? # ...
- Docker容器的备份与恢复,Docker镜像的备份与恢复
1. 备份容器 首先,为了备份Docker中的容器,我们会想看看我们想要备份的容器列表.要达成该目的,我们需要在我们运行着Docker引擎,并已创建了容器的Linux机器中运行 docker ps 命 ...
- OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3
OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...
- 恭喜你发现了宝藏,编程习惯-日积月累
总结: 条件查询可在数据库层创建queryDto进行统一操作. 代码复用:若有代码重复出现了三次,很大概率可以重构.(三则重构) dto和entity中的赋值操作,可以写成方法放在dto中.(充血模型 ...
最新文章
- 中科院自动化所介绍深度强化学习进展:从AlphaGo到AlphaGo Zero
- 云视通手机录像存储在什么地方_抖音影视剪辑抽帧是什么意思
- 关于有限自动机的一篇不错的文章
- 陶陶的兔二,建好啦!
- 用Starlink填补5G和光纤之间的空白
- mysql查询时间段内的数据
- java socket数据传输_Java Socket编程(一) Socket传输模式
- 线程池是如何执行的?拒绝策略有哪些?
- 如何在单例模式下禁止init
- Wavegrove Maji+ for Mac - 饱和压缩器插件
- 如何使用notepad++查看二进制bin文件
- comsol入门闲聊
- 使用Python-OpenCV将图片批量转换为jpg格式
- 山东教师教育网-404、登录、密码找回、常见问题、绑定已有账户
- js制作倒计时,天,小时,分,秒
- 服务器连接异常系统无法登录,Win10系统电脑无法登录LOL提示服务器连接异常的原因及解决方法...
- 印度公开病患接触者追踪应用源代码
- 支付宝app支付功能-服务端的实现-python3版
- kingcms php 标签,MySQL_KingCMS广告标签的使用方法,KINGCMS在3.0的时候我用过,可以 - phpStudy...
- java调用QQ邮箱发送邮件