编译原理词法分析报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

年月日1、实验目的1、为初等函数运算语言构造词法分析器。2、掌握生成词法分析器的方法,加深对词法分析原理的理解。3、掌握设计、编制并调试词法分析程序的思想和方法2、实验内容一、根据下面的要求设计初等函数运算语言的词法模式,并用正则式表达出来1、初等函数运算语言的常量为实数类型,其定义方式为实数的最一般书写方式,如:123.321。具体要求:不支持整数部分大于0时首数字为0;不支持小数点后结尾为0;不支持科学记数法;不支持仅为整数时有小数点;支持负数符号,不支持正数符号。2、初等函数运算语言的变量采用与C语言的标识符定义一样的方式:首字符为字母或下划线;其他的为字母、数字及下划线的混合串;区分大小写;变量长度不超过32个字符。3、初等函数运算语言需要处理的函数仅为表一中所列举的内容。函数的格式及参数内容也如表一所示。4、初等函数运算语言支持四则运算,其计算的符号与C语言相同,为:+-*/。5、初等函数运算语言的合法的分隔符包括:空格、制表符、、分行符圆括号(左、右)、分号。其中空格、制表符、分行符可以出现在任何两个不同的单词中间;圆括号(左、右)用于表达式中,用于改变运算的优先级,以及标识函数的参数;分号用于标识一个语句的结束。6、初等函数运算语言支持的常量还包括:PI,E。其中,PI为圆周率,E为自然常数。二、将正则式转化为最小DFA,给出该DFA的形式化表示和图形表示。三、根据DFA给出状态转换表。四、给出初等函数运算语言的记号表,即词法分析中,语言中的记号将分为多少类,每一类型的编码、类型、属性等内容是什么。五、编写词法分析器,将输入的字符串转化成为记号流,便于后续的语法分析工作。要求词法分析器中能够识别词法错误。2.1词法模式设计/正则式分隔符:compart=\t|\n|(|)|;|空格运算符:operation=+|-|*|/|=|^变量:variable=[a~zA~Z]([a~zA~Z_0~9])*常量:constant=(ε|-)((0|(1~9)(0~9)*)(.(0~9)*(1~9)|ε))|PI|E2.2DFA注:id表示字母,num表示数字2.3状态转换表id01-9下划线减号小数点01341281111198283488838888964844896686788878678988888888注:0是初态,2,6是中间状态,1,3,4,7是终态,其中1表示标示符,3,4,7是实数,8表示不合法的状态,9表示'-'为减号2.4记号表符号SinCostgctgloglgln();?+记号01234567891011符号-*/=常量变量无法识别的标示符^,{}记号12131415161718192021223、实验程序清单#includeiostream#includestringusingnamespacestd;#definemax10charch='';stringkey[7]={sin,cos,tg,ctg,log,lg,ln};//关键字charcompart[6]={'\t','\n','(',')',';',''};//分隔符charoperation[5]={'+','-','*','/','='};//运算符//ints[8]={0,1,2,3,4,6,7,8};//状态集合,0是初态,2,6是中间状态,1,3,4,7是终态,其中1表示标示符,3,4,7是实数,8表示不合法的状态inttoken[23]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22};//0表示sin,1表示cos,2表示tg,3表示ctg,4表示log,5表示lg,6表示ln,7表示(,8表示),9表示;,10表示?,11表示+,12表示-,13表示*,14表示/,15表示=,//16表示常量,17表示变量,18表示不可识别标示符,19表示^,20表示逗号,21表示{,22表示}chararr[32];intstate=0;ints=0;booltag=0;//tag=0表示'-'为负数的负号,tag=1表示'-'为减号FILE*fp;intIsKey(stringc){//判断是否为关键字for(inti=0;i7;i++){if(key[i].compare(c)==0)returni;//返回下标,下标和其token记号一致}return-1;}boolIsLetter(charc){//判断是否为字母if(((c='z')&&(c='a'))||((c='Z')&&(c='A')))return1;elsereturn0;}boolIsNum(charc){//判断是否为1-9的数字if(c='1'&&c='9')return1;elsereturn0;}boolIsUnderline(charc){//判断是否为下划线if(c=='_')return1;elsereturn0;}voidmove(charch,ints){//在状态s接收字符ch后,移动的新状态//arr=arr+ch;switch(s){case0:{if(ch=='_'||IsLetter(ch))state=1;else{if(ch=='0')state=3;elseif(IsNum(ch))state=4;elseif(ch=='-')state=2;elsestate=8;}break;}case1:{if(IsNum(ch)||ch=='_'||IsLetter(ch)||ch=='0')state=1;elseif(ch=='-')state=9;elsestate=8;break;}case2:{if(ch=='0')state=3;elseif(IsNum(ch))state=4;elsestate=8;break;}case3:{if(ch=='.')state=6;elseif(ch=='-')state=9;elsestate=8;break;}case4:{if(IsNum(ch)||ch=='0')state=4;elseif(ch=='-')state=9;elseif(ch=='.')state=6;elsestate=8;break;}case6:{if(ch=='0')state=6;elseif(IsNum(ch))state=7;elsestate=8;break;}case7:{if(ch=='0')state=6;elseif(IsNum(ch))state=7;elseif(ch=='-')state=9;elsestate=8;break;}case8:{if(ch=='-')state=9;elsestate=8;break;}}//switch}voidjudge(chararr[]){if(s==3||s==4||s==7)cout(arrtoken[16])endl;//常量else{if(s==1){if(!strcmp(arr,PI)||!strcmp(arr,E))cout(arrtoken[16])endl;//常量else{if(IsKey(arr)==-1)cout(arrtoken[17])endl;//普通标示符elsecout(arrIsKey(arr))endl;//关键字}}elseif(s==9)cout(arrtoken[12])endl;//减号if(s==8)cout(arrtoken[18])endl;//不可识别标示符标示符}switch(ch){case'+':cout(chtoken[11])endl;break;//运算符case'*':cout(chtoken[13])endl;break;//运算符case'=':cout(chtoken[15])endl;break;//运算符case'/':cout(chtoken[14])endl;break;//运算符case'^':cout(chtoken[19])endl;break;//运算符case'(':cout(chtoken[7])endl;break;//分隔符case')':cout(chtoken[8])endl;break;//分隔符case';':cout(chtoken[9])endl;break;//分隔符case',':cout(chtoken[20])endl;break;//分隔符case'{':cout(chtoken[21])endl;break;//分隔符case'}':cout(chtoken[22])endl;break;//分隔符case'?':cout(chtoken[10])endl;break;//运算开始符case'':case'/t':case'/n':{}}}voidanalyse(FILE*fp){inti=0;while(ch!='EOF'){chararr[32]={'\0'};while(ch!='('&&ch!=')'&&ch!=''&&ch!='\t'&&ch!='\n'&&ch!='{'&&ch!='}'&&ch!=','&&ch!='?'&&ch!='-'&&ch!='^'&&ch!=';'&&ch!='+'&&ch!='*'&&ch!='/'&&ch!='='&&ch!='EOF'){if(i32){arr[i]=ch;move(ch,s);s=state;}i++;ch=fgetc(fp);}//whilejudge(arr);if(ch=='-'){chararr[32]={'\0'};i=0;while(ch!='('&&ch!=')'&&ch!=''&&ch!='\t'&&ch!='\n'&&ch!='{'&&ch!='}'&&ch!=','&&ch!='?'&&ch!='^'&&ch!=';'&&ch!='+'&&ch!='*'&&ch!='/'&&ch!='='&&ch!='EOF'){move(ch,s);s=state;arr[i]=ch;if(state!=9){i++;ch=fgetc(fp);}else{//s=9为减号时chararr[32]={'\0'};break;}}//whilejudge(arr);s=0;i=0;ch=fgetc(fp);}else{chararr[32]={'\0'};ch=fgetc(fp);i=0;s=0;}}//while}voidmain(){charin_fn[30];FILE*fp;cout请输入源文件名(包括路径和后缀名):;for(;;){cinin_fn;if((fp=fopen(in_fn,r))!=NULL)//意思是文件指针fpin在调用fopen打开文件如果失败,则会成为一个空指针!break;//文件顺利打开后,指向该流的文件指针就会被返回。elsecout文件路径错误!请输入源文件名(包括路径和后缀名):;}cout\n********************分析如下*********************endl;ch=fgetc(fp);chararr[32]={'\0'};arr[0]=ch;//fseek(fp,-1,1);analyse(fp);fclose(fp);coutendl;inta;cina;}4、调试过程和运行结果5、程序的主要部分及其功能说明由DFN得到的状

1 / 17
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功