




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验报告姓名:陈家毫 班级:计科1202 学号:201231102099实验一 词法分析程序一、 实验目的构造Training语言的词法分析程序,程序要求能对输入的字符串流进行词法分析。在实验的过程中,学会应用单词分析的方法NFA(非确定有穷自动机)和DFA(确定有穷自动机),加深对词法分析原理的理解。二、 实验内容1. Training惯用的词法(1) 下面是Training语言的关键字。function if then while do endfunc所有的关键字都是保留字,并且必须是小写。(2) 下面是专用符号= + - * / = = ;()#(3) 其他单词是标识符(id)和整型常数(num),通过下列正规定义。Id=letter(letter|digit)*num=digit digit*letter=a |z|A|Zdigit=0|9小写和大写字母是有区别的。(4) 空格由空白、换行符和制表符组成。空格一般用来分隔id、num、运算符和关键字,词法分析阶段通常被忽略。(5) 各种单词符号对应的种别码如图所示单词符号种别码单词符号种别码function1=18if220then323endfunc6=24letter(letter|digit)*10=25digit digit*11;26+13(27-14)28*15#0/162词法分析程序的功能(1)输入为所给文法的源程序字符串。(2)程序的输出形式为单词串的输出形式。 所输出的每一个单词,均按形如(syn,token和sum)的二元式编码。其中,syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。三、 算法设计基本思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。四、 程序流程图状态转换图五、 程序代码#include#includescaner();char prog80,token8;char ch;int syn,p,m,n,sum;char * rwtab6=function,if,then,while,do,endfunc;int i=0,k,c,sumint,f;char fenshu80,sum180;double sumf=0,fudian;int shuzi() if(ch=0 & ch=9) syn=80; else syn=-2; return syn;main()p=0;printf(n please input string :n);doscanf(%c,&ch);prog+p=ch; while(ch!=#); p=0; do scaner(); switch(syn) case 11:printf(n(%d,%d),syn,sum);break; case -1:printf(n error);break; case 80:printf(n(%d,%f),syn,fudian);break; default:printf(n(%d,%s),syn,token); while(syn!=0); scaner() for(n=0;n=a & ch=a & ch=0 & ch=9) tokenm+=ch;/token0=f,m=1 ch=prog+p; tokenm=0; ch=prog-p; syn=10; for(n=0;n=0 & ch=9) c=p; k=0; do sum1k=ch; ch=prog+c; /ch取后一个数字 k+; shuzi();/这个函数用来分析浮点数的整数部分是否已经输入到数组里 f=syn; while(f=80);if(ch=.) for(n=0;n=0;k-) sumf=sumf*0.1+(fenshuk-0)*0.1; /计算浮点数的小数部分 fudian=sumint+sumf; /浮点数计算 syn=80; p=-c; else ch=progp;/若是整数,ch等于原来的值 sum=0; while(ch=0 & ch=9) sum=sum*10+ch-0; ch=prog+p; ch=prog-p;syn=11; else switch(ch) case) syn=21; tokenm+=ch; else syn=20;ch=prog-p; break; case:m=0; tokenm+=ch; ch=prog+p; if(ch=) syn=24; tokenm+=ch; else syn=23; ch=prog-p; break; case=:m=0; tokenm+=ch; ch=prog+p; if(ch=) syn=25; tokenm+=ch; else syn=18; ch=prog-p; break; case!:m=0;tokenm+=ch; ch=prog+p; if(ch=) syn=22; tokenm+=ch; else syn=-1; p-; break; case+:syn=13;token0=ch;break; case-:syn=14;token0=ch;break; case*:syn=15;token0=ch;break; case/:syn=16;token0=ch;break; case;:syn=26;token0=ch;break; case(:syn=27;token0=ch;break; case):syn=28;token0=ch;break; case#:syn=0;token0=ch;break; default:syn=-1; 六、 测试用例functionx=9;if x0 thenx=2*x+1/3;endfunc#测试结果:测试用例a+b=1.1a=2.3#输出结果:实验二 语法分析程序一、实验目的构造文法的语法分析程序,要求采用递归下降语法分析方法对输入的字符串进行语法分析,实现对词法分析所提供的单词序列的语法检查和结构分析,进一步掌握递归下降的语法分析方法。二、实验内容 编写为一上下无关文法构造其递归下降语法分析程序,并对任给的一个输入串进行语法分析检查。程序要求能对输入串进行递归下降语法分析,能判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息。三、实验要求 利用C语言编制递归下降分析程序,并对Training语言进行语法分析1 待分析的Training语言的语法用扩充的BNF表示如下:(1):=functionendfunc(2):=;(3):=(4):=ID=(5):=+|(6):=*|/(7):=ID|NUM|()四、程序流程图主程序Scaner()函数irparser()函数yucu()statement()expression()term()factor()五、程序代码递归下降分析文法:-functionendfunc- ; | | + | - *|/ID | NUM | ()()| (ID) |(NUM)()| (ID) |(NUM)#include #include char prog80,token8;char ch;int syn,p,m=0,n,sum,kk=0;char *rwtab6=function,if,then,while,do,endfunc;void yucu();void expression();void statement();void factor();void term();void irparser();void scaner()for (n=0;n8;n+)tokenn=NULL;while(ch= | ch=n)ch=progp+;m=0;if(ch=a) | (ch=A)while(ch=a) | (ch=A) | (ch=0)tokenm+=ch;ch=progp+;syn=10;for(n=0;n6;n+)if(strcmp(token,rwtabn)=0)syn=n+1;break;tokenm+=0;elseif(ch=0)sum=0;while(ch=0)sum=sum*10+ch-0;ch=progp+;syn=11;elseswitch(ch)case:m=0;tokenm+=ch;ch=progp+;if(ch=)syn=24;tokenm+=ch;elsesyn=23;p-;break;case= :m= 0;tokenm + =ch;ch=progp+;if(ch=) syn= 25;tokenm+= ch;elsesyn=18;ch=prog-p;break;case!:m=0; tokenm+= ch;ch=prog+p;if(ch=) syn=22;tokenm+= ch;else syn=-1;break;case+:syn=13; token0=ch;break;case-:syn=14; token0=ch;break;case*:syn=15; token0=ch;break;case/:syn=16; token0=ch;break;case;:syn=26; token0=ch;break;case(:syn=27; token0=ch;break;case):syn=28; token0=ch;break;case#:syn=0; token0=ch;break;default:syn=-1;/break;ch=progp+; void irparser() if(syn=1)scaner();yucu();/*语句串分析*/if(syn=6) /*读到endfunc*/ scaner();if(syn=0&kk=0)/*程序分析识别完*/printf(success); elseif(kk!=1) /*没以endfunc结束*/printf(error!need endfunc);kk=1; else printf(error!needfunction); kk=1;void yucu() /*语句串分析*/ statement();/*调用语句分析函数*/ while(syn=26)/*一个语句识别结束,继续识别*/ scaner(); statement(); return;void statement()/*语句分析函数*/ if(syn=10)scaner();if(syn=18) /如果是赋值语句scaner();expression(); /这个过程实现语法分析判断语句elseprintf(error!evaluate tag error);kk=1;else if(syn=6)return;elseif(syn=2) /如果是条件判断语句 就判断条件表达式的语法!scaner();if(syn=27) /判断括号匹配do scaner(); /进入括号内部进行表达式分析 expression(); while(syn!=28); else printf(error! need another);kk=1; /()内判断完成 ! scaner(); /然后进行语句块分析! statement(); /到这里是实现判断if语句的语法分析/ 类似的往里添加 循环语句 ! elseif(syn=4) /如果是循环语句 就判断条件表达式的语法!scaner();/ch=progp+;if(syn=27) do scaner(); expression(); while(syn!=28); else printf(error! need another);kk=1; /()内判断完成 ! scaner(); /然后进行语句块分析! statement(); /这里是实现判断while语句的语法分析elseprintf(error!the statement error!);kk=1;void expression()/*表达式分析函数*/ term(); while(syn=13|syn=14) scaner(); term();return; void term()/*项分析函数*/factor();while(syn=15|syn=16)scaner();factor();return;void factor()/*因子分析函数*/ if(syn=10|syn=11)scaner();else/*看是否是表达式*/expression();if(syn=27) scaner();expression();if(syn=28) scaner();else printf(error! need another);kk=1; else printf(error! expression error!);void main()p=0;printf(n please input the string:n);doch=getchar();progp+=ch; while(ch!=#);p=0;ch=progp+;scaner();irparser(); 六、 测试用例functiona=9;x=2*3;b=a+x;endfunc#输出结果:测试用例x=a+b*cendfunc#输出结果:实验三 语义分析程序一、实验目的通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。二、实验内容定义模拟的简单语言的语义成分,将语义分析程序编织成一个子程序,在实验二分析出各语法单位后,分析其含义,并将可执行语句或表达式翻译为四元式输出,并将错误信息输出。三、实验要求采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。输入是语法分析后提供的正确的单词串,输出为三地址指令形式的四元式序列。四、程序流程图 五、程序代码 # include# include# include# include# includestruct quad / 四元式表char result12;char ag112;char op12;char ag212; ;struct quad quad30;int count=0;char *expression(void);char prog200,token9;char ch;int syn,p,m,n,sum=0;int kk=0,k=0;char *rwtab6=function,if,then,while,do,endfunc;void scaner()m=0; for(n=0;n=a& ch=A & ch=a& ch=A&ch=0&ch=9)tokenm+=ch;ch=progp+;/end of whiletokenm+=0;p-;syn=10;for(n=0;n=0&ch=0&ch=9)sum=sum*10+ch-0;ch=progp+;p-;syn=11;elseswitch(ch)case:m=0;tokenm+=ch;ch=prog+p;if(ch=)syn=24;tokenm+=ch;elsesyn=23;ch=prog-p;break;case=:m=0,tokenm+=ch;ch=prog+p;if(ch=)syn=25;tokenm+=ch;elsesyn=18;ch=prog-p;break;case!:m=0;tokenm+=ch;ch=prog+p;if(ch=)syn=22;tokenm+1=ch;elsesyn=-1;break;case+:syn=13;token0=ch;break;case-:syn=14;token0=ch;break;case*:syn=15;token0=ch;break;case/:syn=16;token0=ch;break;case;:syn=26;token0=ch;break;case(:syn=27;token0=ch;break;case):syn=28;token0=ch;break;case#:syn=0;token0=ch;break;default:syn=-1;/end of scanervoid emit(char *result,char *ag1,char *op,char *ag2) /将三地址代码送到四元式表strcpy(quadcount.result,result);strcpy(quadcount.ag1,ag1); strcpy(quadcount.op,op);strcpy(quadcount.ag2,ag2);count+;return;char *newtemp() /返回临时变量t1,t2. char *p;char m8;p=(char *)malloc(8);k+;itoa(k,m,10); /功能将整数装换为字符串。并将值保存在m中。10是基数 表示将k的值转化为10进制数。strcpy(p+1,m);p0=t;return(p);char *factor()char *fplace;fplace=(char *)malloc(12);strcpy(fplace, );if(syn=10)strcpy(fplace,token);scaner();else if(syn=11)itoa(sum,fplace,10);scaner(); else if(syn=27)scaner();fplace=expression();if(syn=28)scaner();elseprintf(n)ERROR);kk=1;elseprintf(n(ERROR);kk=1;return(fplace);char *term(void)char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12); ep2=(char *)malloc(12); eplace=(char *)malloc(12); tt=(char *)malloc(12);strcpy(eplace,factor();while(syn=15|syn=16)if(syn=15)tt0=*;tt1=0;else if(syn=16)tt0=/;tt1=0;scaner();strcpy(ep2,factor();strcpy(tp,newtemp(); /tp为临时变量emit(tp,eplace,tt,ep2); /将三地址代码送到四元式表strcpy(eplace,tp);return(eplace); char *expression()char*tp,*ep2,*eplace,*tt;tp=(char*)malloc(12);ep2=(char*)malloc(12);eplace=(char*)malloc(12);tt=(char*)malloc(12);strcpy(eplace,term();while(syn=13|syn=14)if(syn=13)tt0=+;tt1=0;else if(syn=14)tt0=-;tt1=0;scaner();strcpy(ep2,term();strcpy(tp,newtemp();emit(tp,eplace,tt,ep2);/strcpy(eplace,tp);return(eplace); statement()char tt8,eplace8;int schain=0;switch(syn)case 10:strcpy(tt,token);scaner();if(syn=18)scaner();strcpy(eplace,expression();emit(tt,eplace, , );schain=0;elseprintf(n缺少赋值语句n);kk=1;break;return(schain); yucu()int schain=0;schain=statement(); /进行语句分析while(syn
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025私人汽车买卖合同
- 安防监控服务合同范本
- 2025劳动合同承诺书样本
- 2025年二人合作经营合同
- 2025年农业用地上房屋交易合同
- 搭配中的学问说课课件
- 2025商店租赁权抵押合同
- 搞笑课件教学课件
- 创业面试常见问题及答案解析
- 农业“脑机接口”诞生:植物电信号解码器能否预知病虫害暴发
- 项目成本预算管理制度
- 2025年成都教师招聘考试教育公共基础知识真题及答案
- 中学语文教学资源开发与利用指南
- 《幼儿园工作规程》知识测试卷(含答案)
- 2025年材料管理岗位考试题库
- 年级主任职责详解及管理要点
- 2025至2030中国乙烯醋酸乙烯酯(EVA)树脂行业产业运行态势及投资规划深度研究报告
- 【25秋】统编版小学语文二年级上册-《第八单元大单元设计》课件
- 2025年长沙中考化学试卷真题解读及复习备考指导
- 糖尿病足病的防治课件
- 车辆交通安全课件
评论
0/150
提交评论