自动机变元

自动机结构

草稿结构图:| 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自动机 算术自动机相关推荐

  1. 【元胞自动机】基于matlab元胞自动机多车道信号交叉口仿真【含Matlab源码 818期】

    ⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...

  2. 【元胞自动机】保守策略元胞自动机三车道(不开放辅路,软件园影响)交通流模型matlab源码

    一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何顿 ...

  3. 【元胞自动机】激进策略元胞自动机三车道(开放辅路,软件园影响)交通流模型matlab源码

    一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何顿 ...

  4. 【元胞自动机】基于matlab元胞自动机3D森林火灾模型【含Matlab源码 656期】

    ⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...

  5. 【元胞自动机】激进策略元胞自动机三车道(不开放辅路,软件园影响)交通流模型matlab源码

    一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何顿 ...

  6. 【元胞自动机】保守策略元胞自动机三车道(不开放辅路,软件园不影响)交通流模型【含Matlab源码 1293期】

    ⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...

  7. 【元胞自动机】激进策略元胞自动机三车道(不开放辅路,软件园影响)交通流模型【含Matlab源码 1297期】

    ⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...

  8. 【元胞自动机】激进策略元胞自动机三车道(开放辅路,软件园影响)交通流模型【含Matlab源码 1298期】

    ⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...

  9. 【元胞自动机】保守策略元胞自动机三车道(不开放辅路,软件园影响)交通流模型【含Matlab源码 1294期】

    ⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...

最新文章

  1. dp背包九讲(待补充,暂时前两讲)
  2. 编程:利用杨辉三角形原理来计算组合数
  3. mckinsey game
  4. jquery easyui 多选下拉框的实现
  5. Controller接口控制器(2)
  6. python 两个列表相互映射_零基础同学,一看就会的Python字典操作指南
  7. 基于python的在线考试系统-Python程序设计考试系统的开发与应用.pdf
  8. 修改url 参数_SEO优化设计,如何处理网址的动态参数?
  9. 日文翻译器支持整篇文档批量翻译
  10. 计算机硬盘容量越大运行速度越快,你是不是也感觉电脑内存越大运行速度越快?...
  11. No Silver Bullet: Essence and Accidents of Software | 没有银弹:软件开发中的主要问题和次要问题
  12. python模拟登录URP教务系统评教
  13. 1w存银行一年多少利息_100万存银行1年能有多少钱利息?
  14. iphonex适配游戏_iPhoneX王者荣耀适配问题 iPhoneX游戏问题详解
  15. 自学单片机难吗?单片机编程教学怎么选?
  16. 韩语计算机术语大全,韩语学习:韩语计算机、互联网术语 - 英语家园
  17. 芯片的英文手册需要全部看吗?
  18. SQL错误(1366):Incorrect String Value
  19. 微信小程序跳转页面带参数
  20. MySQL服务端的安装

热门文章

  1. Android之粗仿微信6.0——微信分界面
  2. css 实现蒙版效果
  3. 光猫678响应超时 服务器无应答,天翼宽带障碍处理知识库v11.doc
  4. 那些应该时刻牢记的事
  5. 小数点后几位怎么称呼?
  6. 择时策略 —— 基于扩散指标的沪深300指数择时
  7. 领导最懂怎么恶心人!离职一个多月才拿到离职证明,领导竟在上面留下自己电话用来背调!...
  8. 浪涌保护器的选型和参数解析
  9. DC升压高压电源模块可调直流12V24V转80V95V130V330V210V700V
  10. 2060显卡驱动最新版本_荣耀猎人游戏本V700 游戏本行业新生主力军-荣耀 ——快科技(驱动之家旗下媒体)-...