资源描述:
《编译原理——编译程序构造实践教程 教学课件 作者 张幸儿 戴新宇 301编译程序构造与实践教程第三章.ppt》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、第三章词法分析3.1概况1.词法分析与词法分析程序编译程序的功能是把高级程序设计语言源程序翻译成等价的低级语言目标程序,而源程序本身是一个基本符号序列或字符序列。为此,首先必须进行词法分析,编译程序中完成词法分析工作的部分称为词法分析程序,或称扫描程序。其功能有三:•扫描(读入)源程序字符序列,•识别开符号(单词)并转换为等价的内部中间表示(属性字),•进行一些简单而有利于下一阶段之处理的工作(删除注解与空格等无效字符、某些预处理)。输入:源程序字符序列输出:属性字序列基础文法:正则文法2.符号的识别与重写规则的关系C语言符号:标识符、
2、常量、字符串、标号、界限符(关键字,专用符号)符号都可用正则文法规则来定义:U::=VTU::=T(U、VVN,TVT)<标识符>::=<标识符>字母
3、<标识符>数字
4、字母<整数>::=<整数>数字
5、数字<逻辑与>::=<&符号>&<&符号>::=&其中字母是具体的英文字母,数字是具体的数字。即使关键字,如int等也可以用正则文法规则来定义:::=t::=n::=i因此,关键字的定义都可采用正则文法规则形式。词法分析程序可以手工实现,也可自动生成。3.2词法分析程
6、序的手工实现3.2.1实现要点实现词法分析程序的大致步骤如下:确定程序设计语言(或其子集),明确相应的字符集、符号及其构造总体设计•设计各类数据结构,包括输入(源程序字符序列)与输出(属性字序列),以及各类表格的数据结构•功能模块分解,明确各个模块(子程序)的功能与相互接口,画出总控流程图及各个子程序的控制流程图编程,并设计调试实例,进行调试,完成研制。实现的要点是如下两方面,即,属性字的设计与标识符的处理。3.2.2属性字的设计属性字是符号的内部中间表示,对其设计要求,一是不同的符号都有唯一的表示,能彼此区分开,二是便于后继编译
7、阶段的处理。为此,所有属性字是等长、定长的。属性字指明是什么符号,且刻划了符号的属性。1.属性字的一般结构符号类识别开不同类的符号,符号值识别开同一类中不同的符号。例如标识符类。当词法分析程序扫描到一个标识符时,把它的相关条目登录在标识符表中,以所登录的条目的序号或指针作为相应属性字的符号值,通过此序号或指针可以很方便地存取该标识符。关于无正负号整数,情况类似。符号类符号值2.属性字的设计属性字的设计是词法分析程序之实现的重要方面。它的设计要有利于语法分析阶段的处理。符号编码表如下。符号类编码助记忆名符号类编码助记忆名无定义标识符整数+
8、-*/%<<=>>===!=&&&
9、
10、!=0123456789101112131415161718$UND$ID$NUM$PLUS$MINUS$STAR$SLASH$MOD$LT$LE$GT$GE$EQ$NEQ&ADDR$AND$OR$NOT$ASSIGN()[]{},;voidintfloatcharstructifelsewhiledoforreturn19202122232425262728293031323334353637$LPAR$RPAR$LS$RS$LB$RB$COMMA$SEMICOLON$VOID$INT$FLOAT
11、$CHAR$STRUCT$IF$ELSE$WHILE$DO$FOR$RETURN例属性字序列之例voidmain(){inti,j,d;if(i>j)d=i-j;elsed=j-i;d=d/4;}输入符号属性字序列输入符号属性字序列voidmain(){inti,j,d;if(i>j)d27,"void"1,"main"19,"("20,")"23,"{"28,"int"1,"i"25,","1,"j"25,","1,"d"26,";"32,"if"19,"("1,"i"10,">"j,"j"20,")"1,"d"=i-j;elsed=
12、j-i;d=d/4;}18,"="1,"i"4,"-"1,"j"26,";"33,"else"1,"d"18,"="1,"j"4,"-"1,"i"26,";"1,"d"18,"="1,"d"6,"/"2,"4"26,";“24,"}"相应的属性序列:属性字结构的改进·分成两大类:特定符号、非特定符号·指明说明符还是运算符·运算符时给出优先级特定符号类符号的属性字可有如下的构造。01234567…1516…31特定符号说明符运算符运算符优先级符号类编码符号值运算符优先级定义如下:8:&!+-(单目)7:*/%6:+-
13、(双目)5:<<=>>=4:==!=3:&&2:
14、
15、1:=符号类符号值符号类符号值100027"void"101118"="00001"main"00001"i"100019"("10164"-"10002