词法分析与语法分析程序设计(共54页).doc

上传人:飞****2 文档编号:6816286 上传时间:2022-02-11 格式:DOC 页数:54 大小:566KB
返回 下载 相关 举报
词法分析与语法分析程序设计(共54页).doc_第1页
第1页 / 共54页
词法分析与语法分析程序设计(共54页).doc_第2页
第2页 / 共54页
点击查看更多>>
资源描述

《词法分析与语法分析程序设计(共54页).doc》由会员分享,可在线阅读,更多相关《词法分析与语法分析程序设计(共54页).doc(54页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精选优质文档-倾情为你奉上l 实验三 词法分析与语法分析程序设计一实验目的基本掌握计算机语言的词法分析程序和语法分析程序的设计方法。二实验要求、内容及步骤实验要求:1.根据以下的正规式,画出状态图;标识符:(|)*关键字:if then else while do十进制整数:0 | (1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*运算符和分隔符:+ - * / 0 i= 1;而绝对不要写成IFi0 i=1;因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。这个小语言的单词符号的状态转换图,如下图:2.语法分析是决定如何使用一个文法生成一个终结符串的过

2、程。语法分析器 能识别由加+ 减- 乘* 除/ 乘方 括号()操作数所组成的算术表达式,其文法如下:EE+T|E-T|TTT*F|T/F|FFPF|Pp(E)|i使用的算法可以是:预测分析法;递归下降分析法;算符优先分析法;LR分析法等。分析表格式:id+*()$EE TEE TE EE +TEE E TT FTT FT TT T *FTT T FF idF (E)3.中间代码生成器 产生上述算术表达式的中间代码(四元式序列)。五实验代码及结果词法分析代码:#include#includeusing namespace std;char prog100,token10;char ch;int

3、syn,p,m=0,n,row,sum=0;char *rwtab20=dim,if,do,stop,end ,and,begin,bool,case,char,false,for,int,not,or,set,then,true,until,while;void scaner()for(n=0;n=a&ch=A&ch=0&ch=a&ch=A&ch=Z)tokenm+=ch;ch=progp+;tokenm+=0;p-;syn=21;for(n=0;n=0&ch=0&ch32767)syn=-1;else switch(ch) case=:syn=8+15;token0=ch;break;ca

4、se+:syn=9+15;token0=ch;break;case*:m=0;tokenm+=ch;ch=progp+;if(ch=*)syn=11+15; tokenm+=ch;elsesyn=10+15;p-; break;case,:syn=12+15;token0=ch;break;case(:syn=13+15;token0=ch;break;case):syn=14+15;token0=ch;break;case#:syn=0;token0=ch;break;case)syn=17+15;tokenm+=ch;else if(ch=)syn=16+15;tokenm+=ch;els

5、esyn=15+15;p-;break;case:m=0;tokenm+=ch;ch=progp+;if(ch=)syn=19+15;tokenm+=ch;elsesyn=18+15;p-;break;case:m=0;tokenm+=ch;ch=progp+;if(ch=)syn=21+15;tokenm+=ch;elsesyn=20+15;p-;break;case/:syn=22+15;token0=ch;break;case-:syn=23+15;token0=ch;break;case;:syn=24+15;token0=ch;break;default: syn=-1;break;

6、void main()p=0;row=1;coutendlendlendl;cout词法分析endlendl;cout请输入一段程序(以#结束):;docin.get(ch);progp+=ch;while(ch!=#);p=0;coutendl词法分析结果如下endl;cout种别编码 自身值endl;doscaner();switch(syn)case 22 : cout (syn , sum)endl; break; case -1: cout Error in rowrow!endl; break; default: cout (syn , token)endl;break;while

7、 (syn!=0);词法分析结果:语法分析代码:#include#include#includeusing namespace std;typedef struct table /分析表存储结构 char m100; table;table M100100; /定义分析表typedef struct stacknode /定义栈内元素节点 (带头结点(为空)的) char data; struct stacknode *next;stackk;void initlink(stackk *&s) /初始化新栈 s=(stackk *)malloc(sizeof(stackk); s-next=N

8、ULL;void poplink(stackk *&s) /顶元素出栈 stackk *p;char v; if(s-next!=NULL) p=s-next; v=p-data; s-next=p-next; free(p);void pushlink(stackk *&s,char x) /新 元 素 入 栈 stackk *p; p=(stackk *)malloc(sizeof(stackk); p-data=x; p-next=s-next; s-next=p;void display(stackk *s) /打印 现实显示 栈内元素 stackk *p; int i=0,j; ch

9、ar st100; p=s-next; while(p!=NULL) sti+=p-data; p=p-next; for(j=i-1;j=0;j-) printf(%c,stj); for(j=0;jnext=NULL) return 0; else return s-next-data; int find(char c,char array) /查找函数,int i;int flag=0;for(i=0;i100;i+)if(c=arrayi) flag=1;return flag;int location(char c,char array) /定位函数,指出字符所在位置int i;fo

10、r(i=0;i100;i+)if(c=arrayi) return i;void error() /出错函数定义 printf(%15c出错!n, );void analyse(char Vn,char Vt) int i,j,m,p,q,length,t,h; char w,X; char str100;opt0: scanf(%s,str); for(i=0;istrlen(str);i+) if(!find(stri,Vt) printf(输入字符串有误!请重新输入!); goto opt0; break; stackk *st; initlink(st); pushlink(st,#)

11、; pushlink(st,Vn0); /#与识别符号入栈 j=0; h=1; w=str0; printf(步骤%-12c分析栈%-24c剩余输入串%-12c所用产生式n, , , );opt1: printf(%-16d,h); /显示步骤 h+; display(st); /显示分析栈中内容 X=gettop(st); /上托栈顶符号放入X poplink(st); for(int k=0;k14+j;k+) /打印对齐格式 printf(%c, ); for(t=j;t%sn,X,str0); /显示对应的产生式 if(strcmp(str0,$)=0) goto opt1; else

12、 length=strlen(str0); /逆序进栈 for(m=length-1;m=0;m-) pushlink(st,str0m); goto opt1; int main() int i,k,n,r; char Vn100,Vt100,select; printf(对任意输入LL(1)文法的分析表,判断验证字符串是否为该文法的句子 n); printf(并能给出分析和演示过程。 n); /printf(*n);opt2: printf(请输入各终结符(#号表示结束 )Vti:n); for(i=0;i100;i+) scanf(%c,&Vti); if(Vti=#) r=i; bre

13、ak; printf(请输入非终结符个数:n); scanf(%d,&n); getchar(); for (i=0;in;i+) printf(请输入非终结符Vn%d:n,i); scanf(%c,&Vni); getchar(); printf(请输入此非终结符对应各终结符的产生式右部(null或NULL表示出错;$表示空串):n); for(k=0;kselect; switch(select) case 1: goto opt3;break; case 2: goto opt2; case 0: break; default: printf(输入错误!请重新选择:); goto opt

14、4; break; return 0;语法分析结果:六实验小结通过实验了解到了词法分析和语法分析二者的不同:1.词法规则通常非常简单,不必动用强大的文法来描述;2.对于词法记号,正规式比上下文无关文法提供了更简洁且易于理解的定义;3.从正规式可以自动的构造出有效的词法分析器,从任何文法都很难构造词法分析器;4.把语言的语法结构分成词法和非词法两部分为编译器前端的模块划分提供了方便的途径。 一、目的是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整

15、系统的独立分析和设计的能力,进一步培养学生的独立编程能力。二、任务及要求基本要求:1 词法分析器 产生下述小语言的单词序列这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表: 单词符号种别编码助记符内码值DIMIFDOSTOPEND标识符常数(整)=+*,()1234567891011121314$DIM$IF$DO$STOP$END$ID$INT$ASSIGN$PLUS$STAR$POWER$COMMA$LPAR$RPAR-内部字符串标准二进形式-对于这个小语言,有几点重要的限制:首先,所有的关键字(如IFWHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己

16、定义的标示符。例如,下面的写法是绝对禁止的: IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为 IF i0 i= 1;而绝对不要写成 IFi0 i=1;因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。这个小语言的单词符号

17、的状态转换图,如下图: 2 语法分析器 能识别由加+ 减- 乘* 除/ 乘方 括号()操作数所组成的算术表达式,其文法如下:EE+T|E-T|TTT*F|T/F|FFPF|Pp(E)|i 使用的算法可以是:预测分析法;递归下降分析法;算符优先分析法;LR分析法等。3 中间代码生成器 产生上述算术表达式的中间代码(四元式序列)三、实现过程说明给出各题目的详细算法描述,数据结构和函数说明,流程图。1、词法分析器的流程图2、语法分析器主程序图3、中间代码生成器流程图:四、源程序清单词法分析器#include stdafx.h#include Word.h/构造函数,对数据成员初始化,并将关键字以及运

18、算符读入Word:Word()/打开关键字文件fstream keywordfile(keyword.txt);if(!keywordfile)couterror ! cant open keywordfile!tempwordtempencodetempretempvalue;keywordlist.push_back(tempword);keywordencode.push_back(tempencode);keywordre.push_back(tempre);keywordcodevalue.push_back(tempvalue);/关闭关键字文件keywordfile.close(

19、);for(int i=0;ikeywordlist.size();i+)coutsetw(16)keywordlistisetw(16)keywordencodeisetw(12)keywordreisetw(12)keywordcodevalueiendl;fstream signwordfile(signword.txt);if(!signwordfile) couterror ! cant open signwordfile!tempwordtempencodetempretempvalue;signlist.push_back(tempword);signencode.push_ba

20、ck(tempencode);signre.push_back(tempre);signcodevalue.push_back(tempvalue);/关闭符号文件signwordfile.close();for(int i=0;isignlist.size();i+)coutsetw(16)signlistisetw(16)signencodeisetw(12)signreisetw(12)signcodevalueiendl;/将token中的字符串与character中的字符连接作为token中新的字符串void Word:concatentation()for(int i=0;i100

21、;i+)if(tokeni=NULL)tokeni=s;break;/判断character中的字符是否为字母和数字的布尔函数,是则返回true,否则返回falsebool Word:letter() if(s=a )return true;else if(s=A)return true;elsereturn false;bool Word:digit() if(s=0)return true;return false;/按token数组中的字符串中的前五项(即判别其是否为保留字),若是保留字则返回它的编码int Word:reserve()int leng;/记录token数组中单词的长度f

22、or(int i=0;i100;i+)/计算token数组中单词的长度if(tokeni=NULL)leng=i;break;for(int i=0;ikeywordlist.size();i+)for(int j=0;jkeywordlisti.length();j+)if(keywordlistij!=tokenj)/若某个字符不等则终止此次循环break;if(j+1=keywordlisti.length()/若比较字符全部相等,则判断两者是否长度相等if(leng=keywordlisti.length()return i+1;elsereturn 0;return 0;/将标识符登

23、录到符号表中或将常数登录到常数表中void Word:buildlist()/设置临时变量将标识符的助记符保存string tempword;int tempencode;string tempre;/标识符助记int tempvalue;int tempconstre;/常数助记s=token0;if(letter()/第一个字符如果为字母,则将标识符登录到符号表中 fstream chartostring(convert.txt);if(!chartostring)coutError! Cant open convert fileendl;system(pause);for(int i=0

24、;i100;i+)if(tokeni=NULL)break;elsechartostringtokeni;chartostringendl;chartostring.close();chartostring.open(convert.txt);if(!chartostring)coutError! Cant open convert filetempre;chartostring.close();indentityre.push_back(tempre);tempword=标识符;tempencode=6;tempvalue=indentityre.size();indentitylist.p

25、ush_back(tempword);indentityencode.push_back(tempencode);indentitycodevalue.push_back(tempvalue);fstream indentityfile(indentityword.txt);if(!indentityfile) coutError! Cant open indentityword fileendl;system(pause);/先将文件指针移到最后去,再写入一个endlindentityfile.seekg(0,ios:end);indentityfiletempwordsetw(8)temp

26、encodesetw(12)tempresetw(12)tempvalue;indentityfile.seekg(0,ios:end);indentityfileendl;indentityfile.close();else/token中存储的是常数/将token中的字符数字转换为int类型fstream chartoint(convert.txt);if(!chartoint)coutError! Cant open convert fileendl;system(pause);for(int i=0;i100;i+) if(tokeni=NULL)break;elsechartointtokeni;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 教育教学

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com