哈工大编译原理.ppt

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单词的属性)
4
3.1 词法分析程序的设计
一、词法分析程序的功能
源程序 词法分析器 单词序列
二、 扫描器的任务 1、组织源程序的输入 2、转换成机内表示形式 3、删除注释行、空格及无用符号 4、查填符号表 5、检查词法错误
5
if <12 ,
>
if i>j then i:=0
I
<25 , 符号表入口 >
%%
标识符 {入口地址=LOOKUP();}
%%
LOOKUP()
31
辅助过程是动作需要的,这些过程用C书 写,可以分别编译.例:LOOKUP()
32
SCANNER
OUTPUT
sort
字母

数字 / 界符
RECOGID RECOGDIG HANDLCOM RECOGDEC RECOGSTR
LOOKUP 15
32 词法分析器的手工构造
为了构造词法分析器,要研究构词法, 每种词类的结构模式以及识别它的数 学模型——有穷自动机。它的模拟程 序可以作为词法分析器的控制程序。
{ 列计数-1;
‘/’
TOKEN=(‘/’的识输别出码:,_)‘; /’的TOKEN字或空TOKEN字;
return };
TOKEN='-1';
GETCH(CH);
while 列计数<=行长-1 do
{ CH1:=CH;
call GETCH(CH);
if CH1='*' and CH='/' then TOKEN:=‘ '; }
第三章 词法分析
编译器的各个阶段:
编译器是分

阶段执行的。 号

每个阶段将

源程序从一

种表示转换
成另一种表

编译的各
个阶段
源程序
词法分析器
语法分析器
错 误

语义分析器


中间代码生成器
代码优化器
代码生成器
2
3. 1 词法分析程序的设计: 词法分析器的功能,输出,把它组
织成单独程序
3 . 2 词法分析器的手工构造: 用DFA 能识别
‘+’: TOKEN:=(‘+’的种别码,_); ‘)’: TOKEN:=(‘)’的种别码,_); ‘<’: { call GETCH(CH);
if CH=‘=’then TOKEN:=(‘<=’的种别码,_) else if CH=‘>’ then TOKEN:=(‘<>’的种别码,_)
else { 列计数-1;TOKEN:=(‘<’的种别码,_) } } …….. endcase; return }
if TOKEN!=‘ ’ then call PRINTERR(‘注解未完’);
TOKEN:=‘ ';
return }
25
识别界限符(RECOGDEL) 输入:CH内含单界限符; 输出:各种界符的TOKEN字; procedure RECOGDEL(CH,TOKEN); { case CH of
9
对于关键字、界符、运算符来说,它们 的词类编码就可以表示其完整的信息, 故对于这类单词,其单词自身的属性值 通常为空
而对于标识符,词类编码所反映的信息 不够充分,标识符的具体特性还要通过 单词自身的属性进行互相区分。标识符 的单词自身的属性常用其在符号表中的 入口指针来表示
10
对于常数, 其单词自身的属性常用其在 常数表中的入口指针来表示
26
3.3词法分析程序的自动构造工具LEX简介
一.原理
单词的结构用正规式描述
正规式 NFA DFA min DFA
二.用LEX建立词法分析程序的过程
LEX 源程序 lex.1
LEX 编译器
Lex.yy.c
27
Lex.yy.c 输入流
C
编译器
a.out
a.out
单词序列
三.lex源程序 lex源程序由三部分组成
32 1确定的有限自动机(DFA) 32 2构造识别单词的DFA 32 3 编写词法分析程序
16
分析程序的设计框图
SCANNER
OUTPUT
sort
字母

数字 / 界符
RECOGID RECOGDIG HANDLCOM RECOGDEC RECOGSTR
LOOKUP 17
一、 手工构造识别单词的DFA m
根椐DFA识别单词的定义,在研究给定程 序语言单词结构的基础上,能直接构造出识 别它的DFA m。例如:对于C语言
整数:非空数字串。
无符号实数(用d表示数字):
(a) dd.d dE(+- ) dd 0.1e+14
(b)ddE(+- ) dd
12e-4
(c) dd.d d
procedure SORT(CH);
{ case CH of ‘字母’:
‘字母’: call RECOGID(CH,TOKEN);
‘/’: call HANDLECOM(CH,TOKEN);
‘数字’: call RECOGDIG(CH,TOKEN);
‘’‘
call RECOGSTR(CH,TOKEN);
(1)设计成一个独立程序,完成词 法分析的任务,结果以文件的形式组织, 做为语法分析的输入
源程序
词法 分析
符号表 TOKEN字 错误信息
13
(2)作为语法分析和语义分析的子程序
错误的诊查处理
语法分析
源 词法 程 分析 序
语义分析和 中间代码生成
中 间 代 码
符号表管理
14
五、词法分析程序的设计框图
otherwise call RECOGDEL(CH,TOKEN);
end case;
write TOKEN into TOKEN文件;
Return } 23
procedure RECOGID(CH,TOKEN);
{ WORD:= ‘ ’; WORD:=WORD||CH; Repeat {
call GETCH(CH);
11
以a 语= 句b 子+ ac=*b+d c*d 为例,假设按表 3.1为单词编码,词法分析后的结果为:
Token字
符号表
<25,
>
a 25
<36, -------- > B 25
<25,
>
C 25
<32, -------- >
D 25
<25,
>
<31, -------- >
<25,
>
12
四、 词法分析的设计形式
3 . 3词法分析程序自动构造工具LEX简介
3
L i n e = 8 0 ; 输入
字母
字字母母
0
1
2


数字
3数 4

=
5
输出
id(25) , ‘Line’ =( 36), num(27), ‘80’ ;(45),

6
有穷控制器
单词的词类和属性 (词类符号,
识别标识符; 输入:CH中含标识符的首字母; 输出:TOKEN(二元式形式);
if CH是字母或数字 then
WORD:=WORD||CH; } until CH!=字母或数字;
if CH是非法字符 then
call PRINTERR(‘非法字符’)
else 列计数-1;
if WORD 是关键字
then TOKEN:=(关键字种别码,_)
Repeat FIRSTCH(CH);
模块0:
if CH!=EOL then call SORT(CH)
扫描器主控
else RDLINE;
until CH=EOF;
把符号表,字符串表做成文件;
close源文件,TOKEN文件;
call OUTPUTR; 22
单词分类模块(SORT)输入:
CH内含单词首符;
3.141592
(d) dd…dd
1000
18
标识符:ห้องสมุดไป่ตู้母开始的字母数字串。
例:C语言的标识符
a
a,d
I
B
TT
其它
-
19
例:C语言实常数的文法描述
E
12e-4
d
d
-
d
0d 1.
2
d3
E
4
+
5
d
6
7
d
1000
3.1415
0.1e+1
4
20
二、 编写词法分析程序
根据画出的状态转换图(识别单词的)构 造词法分析程序,每个状态对应一段程序, 完成到达此状态的工作;词法分析程序的控 制程序模拟状态转换图的状态转换。
在识别标识符的过程中,要拼写出来,并和 保留字区别开来;识别出的标识符要填入符 号表中
在识别常数的过程中,要把它转换成机器表 示以作为属性值,记录到常数表中。
21
program SCANNER;
Begin initiate符号表,字符串表,行,列计数器;
Open 源文件,TOKEN文件,打印机文件;
> <39 ,
>
J
<25 ,符号表入口 >
else j:=1
Then <20 ,
>
词 法
I =
<25 ,符号表入口 >
<36 ,
>
分0
<26 ,常数表入口 >
析 else <8 ,
>
j <25 ,符号表入口 >
= <36 ,
>
1
<26 ,常数表入口 > 6
三、词类和属性 程序语言单词的分类: 1.关键字(保留字或基本字):begin,end 2.标识符:用来表示各种名字 3.字面常数:256,3 .14,true,‘abc’ 4. 运算符:如,+、-、*、/ 等等 5.分界符:如逗号,分号,冒号等
28
声明 %% 翻译规则 %% 辅助过程
29
声明包括变量,符号常量和正规定义式。
翻译规则的形式为:
p1
{ 动作1}
p2
{ 动作2}


pn
{ 动作n}
30
每个pi是正规定义式的名子,每个{动 作i}是正规定义式pi识别某类单词时,词 法分析器应执行动作的程序段。用C书 写。
标识符 {字母}({字母}|{数字})*
else { call LOOPUP(WORD,'标识符',ENTRY)
TOKEN:=(标识符种别码,ENTRY)};
Return }; 24
procedure HANDLECOM(TOKEN); { call GETCH(CH); 处理注解(HANDLECOM);
if CH!='*' then
输入:‘/’;进入该模块之前已扫描了一个字符
7
词法分析器的输出:
(词类编码,单词自身的属性值)
词类编码原则: 界符和运算符: 一字一码。 关键字可分成一类,也可以一个关键字分 成一类。 一字一码。
常数可统归一类,也可按类型(整型、实 型、布尔型等),每个类型的常数划分成 一类。 一类型一码。
所有的标识符分为一类。 一类一码。
8
表3.1 单词词类编码
相关文档
最新文档