《2023年词法分析的实验报告.pdf》由会员分享,可在线阅读,更多相关《2023年词法分析的实验报告.pdf(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 词法分析实验报告目录目录,错误!未定义书签。1实验目的.错误!未定义书签。2实验内容.错误!未定义书签。2.1 TINY计算机语言描述。错误!未定义书签。2.2实验规定。错误!未定义书签。3此法分析器的程序实现。错误!未定义书签。3.1状态转换图.错误!未定义书签。3.2程序源码。错误!未定义书签。3.3实验运营效果截图。错误!未定义书签。4实验体会.错误!未定义书签。1 实验目的1、学会针对DFA转换图实现相应的高级语言源程序。2、深刻领略状态转换图的含义,逐步理解有限自动机。3、掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理。2 实验内容2.1 TINY计算机语言描述TIN
2、Y计算机语言的编译程序的词法分析部分实现。从左到右扫描每行该语言源程序的符号,拼成单词,换成统一的内部表达(t oken)送给语法分析程序。为了简化程序的编写,有具体的规定如下:1、数仅仅是整数。2、空白符仅仅是空格、回车符、制表符。3、代码是自由格式。4、注释应放在花括号之内,并且不允许嵌套T INY语言的单词保存字特殊符号其他i f+标记符t h e n(一个或更多的字母)e l s e*e n d/r e p e a t=数u n t i 1(一个或更多的数字)r e a d(w r it e2.2实验规定规定实现编译器的以下功能1、按规则拼单词,并转换成二元式形式2、删除注释行3、删除
3、空白符(空格、回车符、制表符)4、列表打印源程序,按照源程序的行打印,在每行的前面加上行号,并且打印出每行包含的记号的二元形式5、发现并定位错误词法分析进行具体的规定1、记号的二元式形式中种类采用枚举方法定义;其中保存字和特殊字符是每个都一个种类,标示符自己是一类,数字是一类;单词的属性就是表达的字符串值。2、词法分析的具体功能实现是一个函数GetToken。,每次调用都对剩余的字符串分析得到一个单词或记号辨认其种类,收集该记号的符号串属性,当辨认一个单词完毕,采用返回值的形式返回符号的种类,同时采用程序变量的形式提供当前辨认出记号的属性值。这样配合语法分析程序的分析需要的记号及其属性,生成一
4、个语法树。3、标示符和保存字的词法构成相同,为了更好的实现,把语言的保存字建立一个表格存储,这样可以把保存字的辨认放在标示符之后,用辨认出的标示符对比该表格,假如存在该表格中则是保存字,否则是一般标示符。3此法分析器的程序实现3.1状态转换图图1 TIN Y语言的拟定有限自动机(DFA)3.2程序源码#includ e us i ng n a mespac e s t d;#inc 1 u de#i nc 1 ude#i n c I u d eclass C Apubli c:v o id getToken();/辨认标记符v o i d p reDo(c har);/预解决源程序vo i d
5、 d i splay();/打印出CA()6 m=n=0;)pr i va t e:。long count 2;c h a r I D 10 10;int m;o char Cons L10 1 0;int n;ch a r bu f ferl 9 9 999;boolisDigit(char);检查是否为数字符号表/设m为符号表中已有的标记符的个数常数表设n为常数表中已有的常数的个数b ool i s Letter(c h ar);/检查是否为字符o in t Ins e rtlD(c har*s t r Tok e n);添加符号。int Ins e r t Co n st(cha r*s
6、 trToken);添加符号 int S e a r ch(c hara10,const c h a r *,int);二分查找;/e n um va rie ty 标记符,数字,关键字1,关键字2,关键字3,关键字4,关键字5,关键字6,关键字7,关键字8,特殊符号1,/特殊符号2,特殊符号3,特殊符号4,特殊符号5,特殊符号6,特殊符号7,特殊符号8,特殊符号9,特殊符号1 0 ;关键字b i编 码1 2 3 45 678cha r K 1810=els e,end,if,rea d,r e peat,t h en u ntil,write,bool CA:i sDigit(char c)
7、(o if(c=0)re t u rn true;e 1 s e r et u rn false;)b o ol CA::isLe t ter(char c)|o i f(c=,a&c=A&c=Z)return t r u e;e 1 s e r e turn fa I s e;i nt CA:S earc h(c h ar a18 10,const char*b,int n)|。i nt left=O;i n t r i gh t=n-1;i n t mi d=0;wh i Ie(Ie f t=r igh t)。mid=(1 e f t+r i gh t)/2;if(str c mp(a m
8、id,b)=0)r e turn m i d;el s e i f(strcmp(a mid/b)0)left=mid+1 ;。e Ise right=mid-1;)r et u r n-1;int C A:I n sertlD(c h a r*strToken)(。i n t i=0;while(im)设m为符号表中已有的标记符的个数(i f(!s t r c mp(I Diz s t rT o k en)。re t ur n i;。i+;0s s t rcpy(ID i ,s t rTo k e n);m+;re tu r n i;i nt CA:lnser t C onst(ch ar*
9、s t r Token)int i=0;wh i I e(i n)设n为常数表中已有的常数的个数。i f(1st r cmp(Co n s i,str Tok e n)r e t urn i;3 i+;。st r cpy(C o n s i,strToken);。n+;re t urn i;v o i d CA:display()(ch a r f ile n am e 3 0;输入的时候一定要是:/.格式cout”请输入源程序代码.c p p文献的绝对途径:v e n d 1 ;c i n f i l e nam e;。if st re a m i n fi 1 e(f i lenamejo
10、s::in);。i f(linfile)。(6oc e rropen e r ror!e n dl;。a b o rt();。char ch;i n t countl=l;c o un t 2=0;cout 第 c ount 1 行;a whil e(inf i I e.get(ch)0(。preDo(c h);cou t ch;逐行打印出源程序if(ch=,n,)6(countl+;3 o c o u t “第”c o u ntl 行;0 b u f f e r 1 count2+l=0coute n d I;对bu f fe rl中的字符进行扫描。g e tTo k en();in f i
11、l e.cl o s e();coutend 1 ;c ou t ”符号表:“;。for(int i=0;im;i+)。co u t l D i Hcou t endl;cout”数字表:”;fo r(int j=O;j n;j+)。c o u tCons j ;。co u tendl;)void CA:p reDo(c h ar c)(o c h a r*p=b uffe r 1;bufferlf 0=#;赋#给扫描缓冲区的第一个元素co u nt2+;*(p+c o u n t 2)=c;o if(buf f e r 1 c ount 2 删除注释(。i f(c=)cout”注释不允许嵌套
12、!;注释不允许嵌套。i f(c!=z)coun t 2-;。e 1 se c o u nt2=co u n t 2-2;o else if(b uffer 1 count2-l=,&c=)co u n t 2-/若干相继的空白符结合成一个o if(c=r)cou n t 2-;。if(c=z t)c oun t 2-;void C A:g e tToken()o int n=l;,c o u t 第 1 行:”;。fo r(int i=l;is t r 1 en(b u f ferl);i+)。o e if(b u f f erli=n,)n+;co n 第”V Vn 行:;。el s e i
13、 f(i sLe t ter(b uffer 1 i)3string t ok=。t o k+=b uff e r l i;0 3 while(is L etter(b uffer 1 _ +i)。to k+=b u f ferli;。i nt r=Sear c h(K,tok.cstr(),8);。i-;。if(r!=;)coutV(关键字,r+l,tok);/关键字编码o。else6(。cout(标记符,V v to k );/标记符编码r=I nsertl D(char*)t o k,c_s t r();0)b b o e ls e if(isDigit(b uffe r l i )6
14、b st r i n g tok=;。tok+=b ufferl i ;3 w h i le(i s Di g i t(b u ff e r 1+i)(tok+=bufferl i;00 0 0 Iint y=I n sertC o ns t(char*)t o k.c_str();。c o u tV V ”(数字JvV t okVv)。i-;数字编码。)el s e if(b ufferl i=)e ls e(。s t ring to k=”;t ok+=b u f f e r li;eeoint q=Sea r ch(K,t o k.c_str(),1 8);,i f (q!=-l)co
15、u t (特殊符号,t o k );o 白 else o 0。c o u t V”非 法 符 号!”;。)*mai n 函*/int ma i n()(。CA ca;a c a.display();c out 标 识 符 特殊符号,=)特殊符号,=)标IIII 表:a b数字表:1字7,u n til 特殊符号,衣(标 识 处(特殊符号,;与 识 密a碓猊应号,;帚殊符号,”,w rite ;,e n d)(特;青按任意键继续.4实验体会本次实验是 编译技术的第一次实验,按理说也应当是最简朴的一次实验验,但是在具体的实现过程中还是碰到了这样或那样的问题,比如对原输入串进行分析的预解决是在注释的嵌套判断上出现了问题,调试了几次才发现是出现注释时计数值本来应当减2 结果减了 1。类似的错误尚有,但好在最后都解决了。除了提高了自己的动手能力外本次实验最大的收获应当是对词法分析器的运营机制有了更进一步的理解了,再画状态转换的过程中也激发了我的一些关于那些复杂的语言(如 C+)的词法分析器是如何书写的联想,希望在此后的学习实践中能有更进一步的学习。最后感谢老师的悉心指导,谢谢老师!
限制150内