《编译原理词法分析论文.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析论文.docx(23页珍藏版)》请在第壹文秘上搜索。
1、编译原理结课大作业词法分析设计说明书学生姓名阿娜尔古丽台外库力学 号 501Ul(HI2所属学院信息工程学院专 业计算机科学与技术班 级计算机15/信息工程学院摘要:计算机系统与人信息交换界面多数是应用高级语言来实现。一 个高级语言程序的实现,必须依赖于相应的编译系统。所谓编译程序就是指能够 把某一种语言程序转换成另一种与之等价的语言程序。它通常包括五个阶段:词 法分析,语法分析,语义分析与中间代码的产生、优化,目标代码的生成。完成计 算机翻译过程的关键阶段,它为后面的语法分析、语义分析做好准备,打好基础, 以便快速地、高质量地生成目标语言程序。因此词法分析是编译的基础。词法分析器所处理的对象
2、即词法分析程序的输入数据,实际上是源程序经 过编译预处理,去掉多余的符号后而形成的代码,这样给词法分析带来方便。词 法分析的过程是线性的从头至尾扫描一遍,复杂度较低,易实现。关键词:词法分析 C语言 标识符目录1、弓I 言-1 -2、基于C语言词法分析器的设计12词法分析器的设计原则12.2 词法分析器的设计对象22.3 词法分析器的任务及功能32.4 各种单词符号对应的种别码: 43、基于C语言词法分析器的实现53.1 词法分析程序的算法思想: 32 主程序示意图: 53.3 函数定义说明-73.4 程序设计实现及功能说明84、词法分析程序的C语言程序源代码:85、结果分析:166、总结17
3、参考文献-18-1、引言计算机系统与人信息交换界面多数是应用 高级语言来实现。一个高级语言程序的实现,必 须依赖于相应的编译系统。所谓编译程序就是指 能够把某一种语言程序转换成另一种与之等价 的语言程序。它通常包括五个阶段:词法分析, 语法分析,语义分析与中间代码的产生、优化, 目标代码的生成。完成计算机翻译过程的关键阶 段,它为后面的语法分析、语义分析做好准备, 打好基础,以便快速地、高质量地生成目标语言 程序。因此词法分析是编译的基础。2、基于C语言词法分析器的设计2.1词法分析器的设计原则在编译程序工作的五个阶段中,每个阶段都 必须遵从功能等价的原则。词法规则与语法分析 阶段依据的语法规
4、则一同构成了一个语言的语 法,而语法则是从形的角度衡量一个程序是否 合法。所以在词法分析阶段,词法规则成为重要 的研究对象。词法分析器所处理的对象即词法分 析程序的输入数据,实际上是源程序经过编译预 处理,去掉多余的符号后而形成的代码,这样给 词法分析带来方便。词法分析的过程是线性的从 头至尾扫描一遍,复杂度较低,易实现。2. 2词法分析器的设计对象在计算机翻译中,词法分析的关键之一在 于如何识别单词的种类,特别是面对定义形式一 样、结构完全相同的标识符和保留字,如何正确 地解决对它们的识别处理,是词法分析中的一项 重要任务。由于我们规定的C语言程序语句中 涉及单词较少,故在词法分析阶段忽略了
5、单词输 入错误的检查,而将编译程序的重点放在中间代 码生成阶段。词法分析器的功能是输入源程序, 输出单词符号。规定输出的单词符号格式为如下 的二元式:(单词种别,单词自身的值)。通常一种 程序语言中定义的单词种类包括标识符 (identifier) 保留字(reservedw ord)、常数 (literal) 运算符(OPeratOr)、界符等。C 语 言中定义了属于这五种类型的大量的单词,但是 由于预编译器只识别我们自定义的注释,因此预 编译器处理的单词集只是C语言中定义的单词 集的一个真子集。2. 3词法分析器的任务及功能2. 3.1词法分析器的任务从左至右逐个字符地对源程序进行扫描,产
6、 生一个个的单词符号,把作为字符串的源程序转 换成为单词符号串的中间程序。词法分析程序的 输出结果是组成语言的基本元素即单词,在实际 处理的时候,输出并非单词,而是每个单词对应 的二元式,形为单词种别,单词符号的属性,编 码的方式由编译系统的研制者决定。故经过词法 分析,在输出结果中并没有单词本身。3. 3. 2词法分析程序的功能:输入:所给文法的源程序字符串。输出:二元组(Syn, token或SUnI)构成的序 列。其中:Syn为单词种别码;token为存放的单词自身字符串; sum为整型常数。例如:对源程序 begin x:=9: if x9 then x:=2*x+l/3; end #
7、的源文件,经过词法分析后输出如下序列:(1, begin) (10, x) (18, :=) (11, 9) (26, ;) (2, if )2. 4各种单词符号对应的种别码:表2.4各种单词符号对应的种别码单词 符号种别码单词符号种别码bgin1 17If2 ZZ 18Then320wile4O21do523Iettet (letterI digit) *10=24dight dight*1125+13 92614(27*15)28/16#03、基于c语言词法分析器的实现本词法分析器是基于C语言编写,即它本 身程序由C语言编写并且它能识别的源程序单 词串也是C语言编写的源程序。本程序编辑环
8、境是ToUbOC 2. O即可,调用本程序之前需要的 在TC默认路径下编写一个C语言的源程序,并 取名eample.c以便程序调用分析,输出结果为 二元式码。3.1 词法分析程序的算法思想:算法的基本任务是从字符串表示的源程序 中识别出具有独立意义的单词符号,其基本思想 是根据扫描到单词符号的第一个字符的种类,拼 出相应的单词符号。4. 2主程序示意图:主程序示意图如图3-1所示。其中初始包括以下 两个方面:图3-1(1)关键字表的初值。关键字作为特殊标识符处理,把它们预先安排 在一张表格中(称为关键字表),当扫描程序识 别出标识符时,查关键字表。如能查到匹配的单 词,则该单词为关键字,否则为
9、一般标识符。关 键字表为一个字符串数组,其描述如下:Char *rwtab6 = begin“, if”, “then”,“while”,“do”,“end”,;图3-13. 3函数定义说明(1) SearchO查找并识别当前单词类别,并给 定单词类别二元式码,决定给定字符串类别码 (即单词种别)和记录次序码。(2) alphaprocess ()识别当前是数组、保留字、 标识符。(3) point()识别当前字符串是指针。(4) digitprocess ()识别当前是常整数、小数、 负小数。(5) Otherprocess ()识别当前是其它(标点符 号等)。(6) fopen()在默认路
10、径下打开分析程序并读 入字符串。3.4程序设计实现及功能说明1.1 .1关键字的定义void init () for( int j=0; j18; j+) strcpy(symtablej. Iexptr, strj); symtablej. token=j+3; 3.4 . 2符合的关键字的查找int search(char *temp)for(unsigned int i=0;i 18;i+) if(!strcmp(symtablei. Iexptr , temp) return symtablei. token; return 0;4、词法分析程序的C语言程序源代码:#include #
11、include char prog80, token8, ch;int syn, p, m, n, sum;char*rwtab6 = begin, if, then, while, dO , end );scaner ();main ()p=0;printf (zn please input a string (end with #):/);doscanf (%c”, &ch);prog Lp+=ch; while (ch!=, #);P=0;doscaner ();switch(syn)caseIlrprintf (z,( %-10d%5d ) nz, sum, syn);break;ca
12、se -1:Printf(you have input a wrong Stringn);getch();exit (0);default:printf( %-10s%5d )n”, token, syn); break;)while(syn!=O);getch();)scaner () sum=0;for(m=0;m8;m+)tokenm+=NULL; ch=progp+;In=0;while(ch=,,)I I (Ch= n)ch=progp+;if (ch= a,) I I (ch= ) while (ch= a,) I I (ch= A) I I (ch= 0) & (ch= 9,)
13、tokenm+=ch;ch=progp+;p-;syn=10;for (n=0;n=,0,)&(ch=,0,)&(ch=, 9,) sum=sum*10+ch-J 0,;ch=progp+;)P;syn=ll;)else switch(ch) case , :tokenm+=ch;ch=progp+;if (ch=,=,) syn=24; tokenm+=ch;) else syn=23;P一;)break;case , +, : tokenm+=ch;ch=progp+;if (Ch= +,) syn=17;tokenm+=ch;) else syn=13;P一;)break;case :tokenm+=ch;ch=progp+;if (ch=,-,) syn=29; tokenm+=ch;)else syn=14;P一;)break;case ,!,:ch=prog