c语言 if自动机 while自动机 bool自动机 算术自动机
自动机变元
自动机结构
草稿结构图:| if自动机
while自动机 | bool自动机我自己倒是看得懂..
bool自动机归约成B,可以被if,while等自动机调用;
if和while自动机归约成S,被主自动机调用;
主自动机负责代码块;
算术自动机:
只能被bool自动机调用,最终归约成E(不是S)
代码部分
bool自动机代码
int boolautomat(enum Symbols * pst, enum Symbols * tpst, struct _token *sst)
{int * ppst = NULL;//栈指针,用来遍历栈,返回操作码ppst = tpst;int state = 1;//状态int isok = 0;//结束?int opr = 0;while (isok == 0){switch (state){case 1://开始态switch (*ppst){case NEGA:state = 2;break;case NTS_E:state = 4;break;case NTS_B:state = 15;break;case L_PARENS:state = 20;break;case INT:state = 23;break;case ID:state = 23;break;default:state = -1;}break;case 2://B->!Bswitch (*ppst){case NTS_B:state = 3;break;default:state = 1;}break;case 4://B->E||E rop Eswitch (*ppst){case LT:state = 5;break;case GT:state = 6;break;case LE:state = 7;break;case GE:state = 8;break;case EQUL:state = 9;break;default:state = -1;}break;case 5://B->E<.Eswitch (*ppst){case NTS_E:state = 10;break;case INT:state = 23;break;case ID:state = 23;break;default:state = -1;}break;case 6://B->E>.Eswitch (*ppst){case NTS_E:state = 11;break;case INT:state = 23;break;case ID:state = 23;break;default:state = -1;}break;case 7://B->E<=.Eswitch (*ppst){case NTS_E:state = 12;break;case INT:state = 23;break;case ID:state = 23;break;default:state = -1;}break;case 8://B->E>=.Eswitch (*ppst){case NTS_E:state = 13;break;case INT:state = 23;break;case ID:state = 23;break;default:state = -1;}break;case 9://B->E==.Eswitch (*ppst){case NTS_E:state = 14;break;case INT:state = 23;break;case ID:state = 23;break;default:state = -1;}break;case 15://B->B.||B |B.&&B |B.switch (*ppst){case OR:state = 16;break;case AND:state = 18;break;default:state = -1;}break;case 16://B->B||.Bswitch (*ppst){case NTS_B:state = 17;break;case NEGA:state = 2;break;case NTS_E:state = 4;break;case L_PARENS:state = 20;break;case INT:state = 23;break;case ID:state = 23;break;default:state = 1;}break;case 18://B->B&&.Bswitch (*ppst){case NTS_B:state = 19;break;case NEGA:state = 2;break;case NTS_E:state = 4;break;case L_PARENS:state = 20;break;case INT:state = 23;break;case ID:state = 23;break;default:state = 1;}break;case 20://B->(.B)switch (*ppst){case NTS_B:state = 21;break;case NEGA:state = 2;break;case NTS_E:state = 4;break;case L_PARENS:state = 20;break;case INT:state = 23;break;case ID:state = 23;break;default:state = 1;}break;case 21://B->(B.)switch (*ppst){case R_PARENS:state = 22;break;default:state = -1;}break;}ppst++;if (ppst == (pst + pstack))//指针在栈顶{int z = 0;switch (state){case -1:opr = -1;break;case 3:opr= 2;break;case 4://预读 ropswitch (tokentable[ptid].value)//预读{case LE:opr = 0;break;case LT:opr = 0;break;case GE:opr = 0;break;case GT:opr = 0;break;case EQUL:opr = 0;break;case L_PARENS:opr = -1;break;default:opr = 3;break;}break;case 10://B->E<Eopr = 4;break;case 11://B->E>Eopr = 5;break;case 12://B->E<=Eopr = 6;break;case 13://B->E>=Eopr = 7;break;case 14://B->E==Eopr = 8;break;case 15://预读 || && switch (tokentable[ptid].value)//预读{case AND:opr = 0;break;case OR:opr = 0;break;case L_PARENS:opr = -1;break;default://结束状态return 1;break;}break;case 17://B->B||Bopr = 9;break;case 19://B->B && Bopr = 10;break;case 22://B->(B)opr = 11;break;case 23://调用算术自动机z = 0;z = arithautomat(pst,(ppst - 1), sst);if (z == 0){return 0;}opr = 99;break;default:opr = 0;//其他情况均请求归约器入栈}int ok = boolredu(pst, sst, opr);if (ok == -1){return 0;}state = 1;ppst = tpst;//栈指针归位outs(pst);}}
}
while自动机代码
int whileautomat(enum Symbols * pst, enum Symbols * tpst, struct _token *sst)
{int * ppst = NULL;//栈指针,用来遍历栈,返回操作码ppst = tpst;int state = 1;//状态int isok = 0;//结束?int opr = 0;while (isok == 0){switch (state){case 1://开始态switch (*ppst){case WHILE:state = 2;break;case NTS_W:state = 3;break;case NTS_WD:state = 6;break;case NTS_S:return 1;default:state = -1;}break;case 3://WD->W.B doswitch (*ppst){case NTS_B:state = 4;break;default:state = 8;}break;case 4://WD->W B. doswitch (*ppst){case DO:state = 5;break;default:state = -1;}break;case 6://S->WD.Sswitch (*ppst){case NTS_S:state = 7;break;default:state = 9;}break;}ppst++;if (ppst == (pst + pstack))//指针在栈顶{int z = 0;switch (state){case -1:opr = -1;break;case 2:opr = 2;break;case 5://WD->W B doopr = 3;break;case 7://S->WD Sopr = 4;break;case 8://调用bool自动机z = 0;z = boolautomat(pst, (ppst - 1), sst);if (z == 0){return 0;}opr = 99;break;case 9://调用主自动机z = 0;z = mainautomat(pst, (ppst - 1), sst);if (z == 0){return 0;}opr = 99;break;default:opr = 0;//其他情况均请求归约器入栈}int ok = whileredu(pst, sst, opr);if (ok == -1){return 0;}state = 1;ppst = tpst;//栈指针归位outs(pst);}}
}
if自动机代码
int ifautomat(enum Symbols * pst, enum Symbols * tpst, struct _token *sst)
{int * ppst = NULL;//栈指针,用来遍历栈,返回操作码ppst = tpst;int state = 1;//状态int isok = 0;//结束?int opr = 0;while (isok == 0){switch (state){case 1://开始态switch (*ppst){case IF:state = 2;break;case NTS_CA:state = 5;break;case NTS_FA:state = 17;break;case NTS_S:return 1;default:state = -1;}break;case 2://CA->if. B themswitch (*ppst){case NTS_B:state = 3;break;default:state = 18;}break;case 3://CA->if B. themswitch (*ppst){case THEN:state = 4;break;default:state = -1;}break;case 5://FA->CA.Sswitch (*ppst){case NTS_S:state = 6;break;case BEGIN:state = 19;break;default:state = -1;}break;case 7://CBE->else. ifswitch (*ppst){case IF:state = 9;break;default:state = -1;}break;case 10://CB->CBE. B thenswitch (*ppst){case NTS_B:state = 11;break;default:state = 18;}break;case 11://CB->CBE B. thenswitch (*ppst){case THEN:state = 12;break;default:state = -1;}break;case 13://FB->CB. Sswitch (*ppst){case NTS_S:state = 14;break;case BEGIN:state = 19;default:state = 19;}break;case 15://FC->CE.Sswitch (*ppst){case NTS_S:state = 16;break;case BEGIN:state = 19;break;default:state = 19;}break;case 17://S->FA.***switch (*ppst){case ELSE:state = 7;break;case NTS_CBE:state = 10;break;case NTS_CB:state = 13;break;case NTS_CE:state = 15;break;case NTS_FB:state = 20;break;case NTS_FC:state = 22;break;default:state = -1;}break;case 20://S->FA FB...FB FCswitch (*ppst){case NTS_FB:state = 20;break;case NTS_FC:state = 21;break;default:state = 17;ppst--;}break;}ppst++;if (ppst == (pst + pstack))//指针在栈顶{int z = 0;switch (state){case -1:opr = -1;break;case 4://CA->if B thenopr = 2;break;case 6://FA->CA Sopr = 3;break;case 7://预读 IFswitch (tokentable[ptid].value)//预读{case IF:opr = 0;break;default:opr = 4;//CE->elsebreak;}break;case 9://CBE->else ifopr = 5;break;case 12://CB->CBE B thenopr = 6;break;case 14://FB->CB Sopr = 7;break;case 16://FC->CE Sopr = 8;break;case 17://预读 switch (tokentable[ptid].value)//预读{case ELSE:opr = 0;break;case NTS_CBE:opr = 0;break;case NTS_CB:opr = 0;break;case NTS_CE:opr = 0;break;case NTS_FB:opr = 0;break;default:opr = 10;//S->FAbreak;}break;case 18://调布尔自动机z = 0;z = boolautomat(pst, (ppst - 1), sst);if (z == 0){return 0;}opr = 99;break;case 19://调主自动机z = 0;z = mainautomat(pst, (ppst - 1), sst);if (z == 0){return 0;}opr = 99;break;case 20://预读 switch (tokentable[ptid].value)//预读{case ELSE:opr = 0;break;case NTS_FB:opr = 0;break;case NTS_FC:opr = 0;break;default:opr = 12;//S->FAFB...FBbreak;}break;case 21://S->FA FB...FB FC opr = 9;break;case 22:opr = 11;break;default:opr = 0;//其他情况均请求归约器入栈}int ok = ifredu(pst, sst, opr);if (ok == -1){return 0;}state = 1;ppst = tpst;//栈指针归位outs(pst);}}
}
算术自动机代码
int arithautomat(enum Symbols * pst, enum Symbols * tpst, struct _token *sst)//(语法栈,语法栈当前位置,语义栈,)
{int * ppst = NULL;//栈指针,用来遍历栈,返回操作码ppst = tpst;int state = 1;//状态int isok = 0;//结束?int opr = 0;while (isok == 0){//不在栈顶switch (state){case 1://开始态switch (*ppst){case NTS_T:state = 2;break;case INT:state = 3;break;case ID:state = 3;break;case L_PARENS:state = 4;break;case NTS_E:state = 15;break;default:state = -1;}break;case 2://E->T|T.+E|T.-Eswitch (*ppst){case PLUS:state = 5;break;case SUB:state = 6;break;default:state = -1;}break;case 3://T->INT.*T|INT./T|INTswitch (*ppst){case MULT:state = 7;break;case DIV:state = 8;break;default:state = -1;}break;case 4://T->(.E)|E->|T->|switch (*ppst){case INT:state = 3;break;case ID:state = 3;break;case NTS_T:state = 2;break;case NTS_E:state = 13;break;default:state = -1;}break;case 5://T->INT|INT*T|INT/T|(E)|E->T-.E|T+.E|Tswitch (*ppst){case NTS_E:state = 9;break;case NTS_T:state = 2;break;case INT:state = 3;break;case ID:state = 3;break;case L_PARENS:state = 4;break;default:state = -1;}break;case 6://同5,-推导出6状态switch (*ppst){case NTS_E:state = 10;break;case NTS_T:state = 2;break;case INT:state = 3;break;case ID:state = 3;break;case L_PARENS:state = 4;break;default:state = -1;}break;case 7://T->INT*.T|INT/.T|INT|.INT*T|.INT/Tswitch (*ppst){case INT:state = 3;break;case ID:state = 3;break;case NTS_T:state = 11;break;case L_PARENS:state = 4;break;default:state = -1;}break;case 8://同7,/推导出8状态switch (*ppst){case INT:state = 3;break;case ID:state = 3;break;case NTS_T:state = 12;break;case L_PARENS:state = 4;break;default:state = -1;}break;case 13://E->(E.)switch (*ppst){case R_PARENS:state = 14;break;default:state = -1;}break;}ppst++;if (ppst == (pst + pstack))//指针在栈顶{switch (state){case -1:opr=-1;break;case 2://预读+.-switch (tokentable[ptid].value)//预读{case PLUS:opr = 0;break;case SUB:opr = 0;break;case L_PARENS:opr = -1;break;default:opr = 2;break;}break;case 3://预读*./switch (tokentable[ptid].value)//预读{case MULT:opr = 0;break;case DIV:opr = 0;break;case L_PARENS:opr = -1;break;default:opr = 8;break;}break;case 9://T+E.opr = 3;break;case 10://T-E.opr = 4;break;case 11://INT*T.opr = 6;break;case 12://INT/T.opr = 7;break;case 14://T->(E).opr = 5;break;case 15://E.归约完成return 1;default:opr = 0;//其他情况均请求归约器入栈}int ok=arithredu(pst, sst, opr);if (ok == -1){return 0;//错误,返回0}state = 1;ppst = tpst;//栈指针归位outs(pst);}}
}
归约部分则是弹栈压栈,然后结合语义填四元式,之后放上来
c语言 if自动机 while自动机 bool自动机 算术自动机相关推荐
- 【元胞自动机】基于matlab元胞自动机多车道信号交叉口仿真【含Matlab源码 818期】
⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...
- 【元胞自动机】保守策略元胞自动机三车道(不开放辅路,软件园影响)交通流模型matlab源码
一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何顿 ...
- 【元胞自动机】激进策略元胞自动机三车道(开放辅路,软件园影响)交通流模型matlab源码
一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何顿 ...
- 【元胞自动机】基于matlab元胞自动机3D森林火灾模型【含Matlab源码 656期】
⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...
- 【元胞自动机】激进策略元胞自动机三车道(不开放辅路,软件园影响)交通流模型matlab源码
一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何顿 ...
- 【元胞自动机】保守策略元胞自动机三车道(不开放辅路,软件园不影响)交通流模型【含Matlab源码 1293期】
⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...
- 【元胞自动机】激进策略元胞自动机三车道(不开放辅路,软件园影响)交通流模型【含Matlab源码 1297期】
⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...
- 【元胞自动机】激进策略元胞自动机三车道(开放辅路,软件园影响)交通流模型【含Matlab源码 1298期】
⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...
- 【元胞自动机】保守策略元胞自动机三车道(不开放辅路,软件园影响)交通流模型【含Matlab源码 1294期】
⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...
最新文章
- dp背包九讲(待补充,暂时前两讲)
- 编程:利用杨辉三角形原理来计算组合数
- mckinsey game
- jquery easyui 多选下拉框的实现
- Controller接口控制器(2)
- python 两个列表相互映射_零基础同学,一看就会的Python字典操作指南
- 基于python的在线考试系统-Python程序设计考试系统的开发与应用.pdf
- 修改url 参数_SEO优化设计,如何处理网址的动态参数?
- 日文翻译器支持整篇文档批量翻译
- 计算机硬盘容量越大运行速度越快,你是不是也感觉电脑内存越大运行速度越快?...
- No Silver Bullet: Essence and Accidents of Software | 没有银弹:软件开发中的主要问题和次要问题
- python模拟登录URP教务系统评教
- 1w存银行一年多少利息_100万存银行1年能有多少钱利息?
- iphonex适配游戏_iPhoneX王者荣耀适配问题 iPhoneX游戏问题详解
- 自学单片机难吗?单片机编程教学怎么选?
- 韩语计算机术语大全,韩语学习:韩语计算机、互联网术语 - 英语家园
- 芯片的英文手册需要全部看吗?
- SQL错误(1366):Incorrect String Value
- 微信小程序跳转页面带参数
- MySQL服务端的安装
热门文章
- Android之粗仿微信6.0——微信分界面
- css 实现蒙版效果
- 光猫678响应超时 服务器无应答,天翼宽带障碍处理知识库v11.doc
- 那些应该时刻牢记的事
- 小数点后几位怎么称呼?
- 择时策略 —— 基于扩散指标的沪深300指数择时
- 领导最懂怎么恶心人!离职一个多月才拿到离职证明,领导竟在上面留下自己电话用来背调!...
- 浪涌保护器的选型和参数解析
- DC升压高压电源模块可调直流12V24V转80V95V130V330V210V700V
- 2060显卡驱动最新版本_荣耀猎人游戏本V700 游戏本行业新生主力军-荣耀 ——快科技(驱动之家旗下媒体)-...