资源描述:
《编译原理实验 词法分析.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、词法分析实验报告实验目的:用C语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。C.1词法分析C.1.1实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。c.1.2实验要求c.1.2.1待分析的简单语言的词法(1)关键字:beginifthenwhiledoend所有关键字都是小写。(2)运算符和界符::=+・*/<><=<>>=;()#(3):其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letterIdigit)*NUM=digitdigi
2、t*(4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。C.1.2.2各种单词符号对应的种别码单词符号种别码单词符号种别码Begin1■■17If2•■—18Then3<20While4O21Do5<=22End6>23Letter(letter+digit)*10>=24Digitdigit*11=25+13■■26-14(27*15)28/16#0C.1.2.3词法分析程序的功能输入:所给文法的源程序字符串。输出:二元组(syn,token或num)构成的序列。其中:syn为单词种别码;to
3、ken为存放的单词自身字符串;sum为整型常数。例如:对源程序beginx:=9;ifx>0thenx:=2*x+l/3;end#的源文件,经词法分析后输出如下序列:(1,begin)(10,'x')(l&:=)(11,9)(29,;)(2,计)…C1.3词法分析程序的算法思想算法的基本任务是从字符串表示的源程序屮识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。1.主程序示意图主程序示意图如图C1所示。其中初值包括如下两个方面:(1)关键字表的初值。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称
4、为关键字表),当扫描程序识别出标识符,查关键字表。如能查到匹配的单词,则该单词的关键字,否则为一般标识符。关键表为一个字符串数组,其描述如下:char*rwtab[6]=”begin'',''iF',''then'',”whib'',''do'',ln(r};(2)程序中需要用到的主要变量为syn,token和sum.2•扫描子程序的算法思想首先设置3个变量:(1)token用來存放构成单词符号的字符串;(2)sum用來存放整型单词(3)syn用来存放单词符号的识别码。程序实现代码:%{char*keywor(H6]=r'for”,”if”,“then”,
5、”else”,”while”,”do”};〃关键字表inti=0,token=0;charnum[40J;charid[40];#include#include%}delim[At]wsletterdigitIDNUMOPERATOR{delim)+[a-zA-Z][0-9]{letter}({letter}l{digit})*{digit}+(.{digit)+)?(E[+・]?{digit}+)?”+”l”・'T'*'T7'T':'T':='T'v'T'v>'TN='T'>'T'>='T'='T';'T'(
6、'T')'T'#”%%{ID}I{NUM)I{OPERATOR}{scan();}{ws}{/*什么都不做*/}%%intmain(intargc,char**argv){yyin=fopen(Ma.txt,T,);〃欲扫描的源代码放在a.txt里yyout=fopen(,,b.txt",nwM);〃输出的记号流放在b.txt里yylex();fclose(yyin);return0;}scan(){do{Iexical();〃将词法单元对应的记号保存到token中,属性值保存到num或者id中switch(token){case11:fprintf(y
7、yout,H(%d,%s)",token,num);break;casefprintf(yyout,"error!r');break;default:fprintf(yyout,"(%d,%s)",token,id);}break;)while(token!=0);)lexical(){ifCO'<=yytextlOJ&&yytext[0]v=9)〃识别出无符号数{token=11;strcpy(num,yytext);Ielseif(*a'<=yytext[O]&&yy(exf[0]v='z'IIAv=yytex([0]&&yytext[O]v='Z
8、')〃识别出标识符(包含关键字){if(strcmp(yytext