已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
#include stdio.h#include string.h#define ACC -2/*/#define sy_if 0#define sy_then 1#define sy_else 2#define sy_while 3#define sy_begin 4#define sy_do 5#define sy_end 6#define a 7#define semicolon 8#define e 9#define jinghao 10#define S 11#define L 12#define tempsy 15#define EA 18#define E0 19#define plus 34#define times 36#define becomes 38#define op_and 39#define op_or 40#define op_not 41#define rop 42#define lparent 48#define rparent 49#define ident 56#define intconst 57/*/char ch=0;int count=0;static char spelling10=;static char line81=;char *pline;static char ntab110010;struct ntab int tc; int fc; ntab2200;int label=0;struct rwords char sp10; int sy; ;struct rwords reswords10=if,sy_if, do,sy_do, else,sy_else, while,sy_while, then,sy_then, begin,sy_begin, end,sy_end, and,op_and, or,op_or, not,op_not;struct aa int sy1; int pos; buf1000, n, n1, E, sstack100, ibuf100, stack1000;struct aa oth;struct fourexp char op10; struct aa arg1; struct aa arg2; int result; fexp200;int ssp=0;struct aa *pbuf=buf;int nlength=0;int lnum=0;int tt1=0;FILE *cfile;/*/int newt=0;int nxq=100;int lr;int lr1;int sp=0;int stack1100;int sp1=0;int num=0;struct ll int nxq1; int tc1; int fc1; labelmark10;int labeltemp10;int pointmark=-1,pointtemp=-1;int sign=0;/*LR*/static int action1913= 2,-1,-1,3,4,-1,-1,5,-1,-1,10,1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,ACC,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1, 2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,8, -1,-1,104,-1,-1,-1,104,-1,104,-1,104,-1,-1, -1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,11,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,12,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,105,-1,13,-1,-1,-1,-1, 2,-1,-1,3,4,-1,-1,5,-1,-1,-1,14,-1, 2,-1,-1,3,4,-1,-1,5,-1,-1,-1,15,-1, -1,-1,103,-1,-1,-1,103,-1,103,-1,103,-1,-1, 2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,16, -1,-1,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,102,-1,-1,-1,102,-1,102,-1,102,-1,-1, -1,-1,-1,-1,-1,-1,106,-1,-1,-1,-1,-1,-1, 2,-1,-1,3,4,-1,-1,5,-1,-1,-1,18,-1, -1,-1,101,-1,-1,-1,101,-1,101,-1,101,-1,-1;/*LR*/static int action1107= 3,-1,-1,2,-1,-1,1, -1,4,5,-1,-1,ACC,-1, 3,-1,-1,2,-1,-1,6, -1,104,104,-1,104,104,-1, 3,-1,-1,2,-1,-1,7, 3,-1,-1,2,-1,-1,8, -1,4,5,-1,9,-1,-1, -1,101,5,-1,101,101,-1, -1,102,102,-1,102,102,-1, -1,103,103,-1,103,103,-1;/*LR*/static int action21611= 1,-1,4,-1,5,-1,-1,-1,13,7,8, -1,2,-1,101,-1,101,101,101,-1,-1,-1, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,102,-1,102,102,102,-1,-1,-1, 1,-1,4,-1,5,-1,-1,-1,11,7,8, 1,-1,4,-1,5,-1,-1,-1,6,7,8, -1,-1,-1,104,-1,9,10,104,-1,-1,-1, 1,-1,4,-1,5,-1,-1,-1,14,7,8, 1,-1,4,-1,5,-1,-1,-1,15,7,8, 105,-1,105,-1,105,-1,-1,-1,-1,-1,-1, 107,-1,107,-1,107,-1,-1,-1,-1,-1,-1, -1,-1,-1,12,-1,9,10,-1,-1,-1,-1, -1,-1,-1,103,-1,103,103,103,-1,-1,-1, -1,-1,-1,-1,-1,9,10,ACC,-1,-1,-1, -1,-1,-1,106,-1,9,10,106,-1,-1,-1, -1,-1,-1,108,-1,9,10,108,-1,-1,-1;/*/readline() char ch1; pline=line; ch1=fgetc(cfile); while(ch1!=n)&(ch1!=EOF) *pline=ch1; pline+; ch1=fgetc(cfile); *pline=0; pline=line;/*/readch() if(ch=0) readline(); lnum+; ch=*pline; pline+;/*/find(char spel) int ss1=0; int ii=0; while(ss1=0)&(ii=a)&(ch=0)&(ch=9); pline-; spellingk=0; while(ss=0)&(iii10) if(!strcmp(spelling,reswordsiii.sp) ss=1; iii+; /*/ if(ss=1) bufcount.sy1=reswordsiii-1.sy; else bufcount.sy1=ident; j=find(spelling); if(j=-1) bufcount.pos=tt1; strcpy(ntab1tt1,spelling); tt1+; nlength+; else bufcount.pos=j; count+; for(k=0;k=0)&(ch=9); bufcount.sy1=intconst; bufcount.pos=ivalue; count+; pline-;/*/scan() int i; while(ch!=) switch(ch) case :break; case a: case b: case c: case d: case e: case f: case g: case h: case i: case j: case k: case l: case m: case n: case o: case p: case q: case r: case s: case t: case u: case v: case w: case x: case y: case z:identifier();break; case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9:number();break; case ) bufcount.pos=4; else bufcount.pos=1; pline-; bufcount.sy1=rop; count+; break; case : readch(); if(ch=) bufcount.pos=2; else bufcount.pos=3; pline-; bufcount.sy1=rop; count+; break; case (: bufcount.sy1=lparent; count+; break; case ): bufcount.sy1=rparent; count+; break; case #: bufcount.sy1=jinghao; count+; break; case +: bufcount.sy1=plus; count+; break; case *: bufcount.sy1=times; count+; break; case : readch(); if(ch=) bufcount.sy1=becomes; count+; break; case =: bufcount.sy1=rop; bufcount.pos=5; count+; break; case ;: bufcount.sy1=semicolon; count+; break; readch(); bufcount.sy1=-1;/*/readnu() if(pbuf-sy1=0) n.sy1=pbuf-sy1; n.pos=pbuf-pos; pbuf+; /*/newtemp() newt+; return newt;/*/gen(char op1,struct aa arg11,struct aa arg22,int result1) strcpy(fexpnxq.op,op1); fexpnxq.arg1.sy1=arg11.sy1; fexpnxq.arg1.pos=arg11.pos; fexpnxq.arg2.sy1=arg22.sy1; fexpnxq.arg2.pos=arg22.pos; fexpnxq.result=result1; nxq+; return nxq-1;/*/merg(int p1,int p2) int p; if(p2=0) return p1; else p=p2; while(fexpp.result!=0) p=fexpp.result; fexpp.result=p1; return p2; backpatch(int p,int t) int tempq; int q; q=p; while(q!=0) tempq=fexpq.result; fexpq.result=t; q=tempq; /*/change1(int chan) switch(chan) case ident: case intconst:return 0; case plus:return 1; case times:return 2; case lparent:return 3; case rparent:return 4; case jinghao:return 5; case tempsy:return 6; change2(int chan) switch(chan) case ident: caseinconst:return 0; case rop:return 1; case lparent:return 2; case rparent:return 3; case op_not:return 4; case op_and:return 5; case op_or:return 6; case jinghao:return 7; case tempsy:return 8; case EA:return 9; case E0:return 10;/*/lrparse1(int num) lr1=action1stack1sp1change1(n1.sy1); if(lr1=-1) printf(n!n); getch(); exit(0); if(lr1=0) sp1+; stack1sp1=lr1; if(n1.sy1!=tempsy) ssp+; num+; sstackssp.sy1=n1.sy1; sstackssp.pos=n1.pos; n1.sy1=ibufnum.sy1; n1.pos=ibufnum.pos; lrparse1(num); if(lr1=100)&(lr1105) switch(lr1) case 100:break; case 101:E.pos=newtemp(); gen(+,sstackssp-2,sstackssp,E.pos+100); ssp=ssp-2; sstackssp.sy1=tempsy; sstackssp.pos=E.pos; sp1=sp1-3; break; case 102:E.pos=newtemp(); gen(*,sstackssp-2,sstackssp,E.pos+100); ssp=ssp-2; sstackssp.sy1=tempsy; sstackssp.pos=E.pos; sp1=sp1-3; break; case 103:E.pos=sstackssp-1.pos; ssp=ssp-2; sstackssp.sy1=tempsy; sstackssp.pos=E.pos; sp1=sp1-3; break; case 104:E.pos=sstackssp.pos; sp1-; break; n1.sy1=tempsy; n1.pos=E.pos; lrparse1(num); if(lr1=ACC)&(stack1sp1=1) gen(:+,sstackssp,oth,ibuf0.pos); ssp=ssp-3; sp1=sp1-3; /*/lrparse2(int num) int templabel; lr1=action2stack1sp1change2(n1.sy1); if(lr1=-1) if(sign=2) printf(nwhilen); if(sign=3) printf(nifn); getch(); exit(0); if(lr1=0) sp1+; stack1sp1=lr1; ssp+; sstacksp1.sy1=n1.sy1; sstackssp.pos=n1.pos; if(n1.sy1!=tempsy)&(n1.sy1!=EA)&(n1.sy1!=E0) num+; n1.sy1=ibufnum.sy1; n1.pos=ibufnum.pos; lrparse2(num); if(lr1=100)&(lr1109) switch(lr1) case 100:break; case 101: ntab2label.tc=nxq; ntab2label.fc=nxq+1; gen(jnz,sstackssp,oth,0); gen(j,oth,oth,0); sp1-; ssp-; label+; n1.sy1=tempsy; break; case 102: ntab2label.tc=nxq; ntab2label.fc=nxq+1; switch(sstackssp-1.pos) case 0: gen(j=,sstackssp-2,sstackssp,0); break; case 1: gen(j=,sstackssp-2,sstackssp,0); break; case 3: gen(j,sstackssp-2,sstackssp,0); break; case 4: gen(j,sstackssp-2,sstackssp,0); break; case 5: gen(j=,sstackssp-2,sstackssp,0); break; gen(j,oth,oth,0); sp1=sp1-3; ssp=ssp-3; label+; n1.sy1=tempsy; break; case 103: label=label-1; ssp=ssp-3; sp1=sp1-3; label+; n1.sy1=tempsy; break; case 104: label=label-1; templabel=ntab2label.tc; ntab2label.tc=ntab2label.fc; ntab2label.fc=templabel; ssp=ssp-2; sp1=sp1-2; label+; n1.sy1=tempsy; break; case 105: backpatch(ntab2label-1.tc,nxq); label=label-1; ssp=ssp-2; sp1=sp1-2; label+; n1.sy1=EA; break; case 106: label=label-2; ntab2label.tc=ntab2label+1.tc; ntab2label.fc=merg(ntab2label.fc,ntab2label+1.fc); ssp=ssp-2; sp1=sp1-2; label+; n1.sy1=tempsy; break; case 107: backpatch(ntab2label-1.fc,nxq); label=label-1; ssp=ssp-2; sp1=sp1-2; label+; n1.sy1=E0; break; case 108: label=label-2; ntab2label.fc=ntab2label+1.fc; ntab2label.tc=merg(ntab2label.tc,ntab2label+1.tc); ssp=ssp-2; sp1=sp1-2; label+; n1.sy1=tempsy; break; lrparse2(num); if(lr1=ACC) return 1;/*(:)*/test(int value) switch(value) case intconst: case ident: case plus: case times: case becomes: case lparent: case rparent: case rop: case op_and: case op_or: case op_not:return 1; default:return 0; /*/lrparse() int i1=0; int num=0; if(test(n.sy1) if(stacksp.sy1=sy_while) sign=2; else if(stacksp.sy1=sy_if) sign=3; else sign=1; do ibufi1.sy1=n.sy1; ibufi1.pos=n.pos; readnu(); i1+; while(test(n.sy1); ibufi1.sy1=jinghao; pbuf-; sstack0.sy1=jinghao; ssp=0; if(sign=1) sp1=0; stack1sp1=0; num=2; n1.sy1=ibufnum.sy1; n1.pos=ibufnum.pos; lrparse1(num); n.sy1=a; if(sign=2)|(sign=3) pointmark+; labelmarkpointmark.nxq1=nxq; sp1=0; stack1sp1=0; num=0; n1.sy1=ibufnum.sy1; n1.pos=ibufnum.pos; lrparse2(num); labelmarkpointmark.tc1=ntab2label-1.tc; labelmarkpointmark.fc1=ntab2label-1.fc; backpatch(labelmarkpointmark.tc1,nxq); n.sy1=e; lr=actionstacksp.posn.sy1; printf(stack%d=%dttn=%dttlr=%dn,sp,stacksp.pos,n.sy1,lr); if(lr=0) sp+; stacksp.pos=lr; stacksp.sy1=n.sy1; readnu(); lrparse(); if(lr=100) switch(lr) case 100:break; case 101: printf(S-if e then s else s n); sp=sp-6; n.sy1=S; fexplabeltemppointtemp.result=nxq; pointtemp-; if(stacksp.sy1=sy_then) gen(j,oth,oth,0); backpatch(labelmarkpointmark.fc1,nxq); pointtemp+; labeltemppointtemp=nxq-1; pointmark-; if(stacksp.sy1=sy_do) gen(j,oth,oth,labelmarkpointmark.nxq1); backpatch(labelmarkpointmark.fc1,nxq); break; case 102:printf(S-while e do s n); sp=sp-4; n.sy1=S; pointmark-; if(stacksp.sy1=sy_do) gen(j,oth,oth,labelmarkpointmark.nxq1); backpatch(labelmarkpointmark.fc1,nxq); if(stacksp.sy1=sy_then) gen(j,oth,oth,0); fexplabelmarkpointmark.fc1.result=nxq; pointtemp+; labeltemppointtemp=nxq-1; break; case 103:printf(S-begin L end n); sp=sp-3; n.sy1=S;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 设计师个人年度述职报告
- 人力资源主管年度述职报告模板
- 矿上施工道路施工方案
- 2026年计算机二级证书撤销标准试卷
- 带电轨道施工方案
- 感恩主题班会课件(共23张)
- 仿生算法在证券市场中的优化
- 梯田施工工艺
- 宁夏回族自治区银川外国语实验学校2026届初三年级二模考试英语试卷-文字版-含答案-
- 2026年二级公共营养师(技师)考试(理论知识)综合练习题及答案
- 航空器地面灭火知识培训课件
- 防暑防汛的培训课件
- 《中小学跨学科课程开发规范》
- DZ/T 0156-1995区域地质及矿区地质图清绘规程
- 学生奶采购配送服务方案(技术标)
- 2025年锂电池安全生产管理和风险辨识手册
- 简约中国农业银行模板
- 医院临床医学带教老师培训
- 管道振动的主要原因、危害及消除措施
- 2022年CSCO软组织肉瘤诊疗指南
- 第一 二章综合测试卷 北师大版八年级数学上册
评论
0/150
提交评论