词法分析是翻译的第一阶段是语法分析的必要准备。词法分

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

字符序列
单词序列
───>扫描器───>语法分析器──> . . .
②作为子程序
源程序
Token
词法分析程序
语法分析程序
get token
词法分析程序的主要任务: - 读源程序,产生单词符号 词法分析程序的其他任务: - 滤掉空格,跳过注释、换行符 - 追踪换行标志,复制出错源程序, - 宏展开,……
wsym[2]:=callsym;
… wsym[13]:=writesym;
Hale Waihona Puke Baidu
PL/0编译程序文本中开始对类型的定义中给出单词定义 (见附录):
Type symbol=(nul,ident,number,plus,…,varsym, procsym);
定义单词是纯量/枚举类型,又定义了3个全程量为: sym: symbol; id: alfa; num: integer; alfa=packed array[1..a1] of char;
单词类别及其输出形式
单词可作各种分类,典型地分为5类: ①保留字 AND,BEGIN,FOR,TYPE,VAR等 ②标识符 用户定义的常量、类型、变量、
过程名 ③常量 12, 1997, 4.14, ‘A’, 等 ④运算符 +,-,*,/,>,<>,!=,#等 ⑤界限符 ; , ( ) 等
词法分析程序所输出的单词符号常常采用 以下二元式表示:
PL/0词法分析的设计与实现:
PL/0编译程序的词法分析
PL/0的词法分析程序GETSYM(P15图2.5)是一个独立 的过程,其功能是为语法分析提供单词用的,是语 法分析的基础,它把输入的字符串形式的源程序分 割成一个个单词符号。为此PL/0编译程序设置了三 个全程量的公用单元如下:
SYM:存放每个单词的类别,用内部编码形式表示 ID: 存放用户所定义的标识符的值。
(单词种别,单词自身的值)。
单词的种别是语法分析需要的信息,而单 词自身的值则是编译其它阶段需要的信息。
比如在PASCAL的语句const i=25, yes=1;中 的单词 25和1的种别都是常数,常数的值 25和1对于代码生成来说,是必不可少的。
有时,对某些单词来说,不仅仅需要它的值,还需
常数虽然也是固定的,但个数太多,而每 个程序只用很少一部分,不宜预先造表。 编译只对源程序中出现的各类常量造表, 如整数表、实数表、字符串表等。
例如,整数表IntTab存放源程序中的整常 数,扫描器拼出整数时,查IntTab表,若无 此数,则填入表中;若已有此数,则不在 填入,而把该数在表中的地址intp作为其 机内码的一部分,由它联系机内码和数值。
NUM:存放用户定义的数。
单词的种类有五种。 基本字:也可称为保留字或关键字,如BEGIN, END,IF,THEN等。 运算符:如:+、-、*、/、∶=、#、>=、<= 等。 标识符:用户定义的变量名、常数名、过程名。 常数:如:10,25,100等整数。 界符:如:','、'.'、';'、'('、')'等。
= 10 , 指向y的符号表入口指针 = 20 , 指向sum的符号表入口指针 ;
程序段 if i=5 then x∶=y;在经词法分析器扫 描后输出的单词符号和它们的表示如下: - 保留字if(3,'if') - 标识符i(1,指向i的符号表入口) - 等号=(4,'=') - 常数5(2,'5') - 保留字then(3,'then') - 标识符x(1,指向x的符号表入口) - 赋值号∶=(4,'∶=') - 标识符 y(1,指向y的符号表入口) - 分号;(5,';')
词法分析是翻译的第一阶段,是语法分析 的必要准备。词法分析程序也称为扫描程 序或扫描器(scanner)。
词法分析是编译过程中的一个阶段,可以在 语法分析前进行 。也可以和语法分析结合 在一起作为一遍,由语法分析程序调用词 法分析程序来获得当前单词供语法分析使 用。
实现方式
①作为单独的一遍
标识符的意义是由用户定义的,与常量类 似,编译器也构造一个标识符表IdTab。每 识别出一个标识符,则查IdTab表,若无则 填入,已有则不填,用其在表中的地址idp 作为联系机内码和自身值的桥梁。
词法分析工作从语法分析工作独立出来的原因:(P48) 简化设计 改进编译效率 增加编译系统的可移植性
因此词法分析程序GETSYM将完成下列任务: (1) 滤空格:空格在词法分析时是一种不可
缺少的界符,而在语法分析时则是无用的,所以 必须滤掉。
(2) 识别保留字:设有一张保留字表。对每 个字母打头后接字母或数字的字符串要查此表。 若查着则为保留字,将对应的类别放在SYM中。 如IF对应值IFSYM,THEN对应值为THENSYM。若查 不着,则认为是用户定义的标识符。
词法分析程序的输出形式-----二元式
单词类别 单词的属性值
单词类别可以用整数编码表示:一类一种或一字一种
单词类别
关键字 标识符 常数 运算符 分界符
编码
1 2 3 4 5
int x=10,y=20,sum;词法分析的结果
单词类别 1 2 4 3 5 2 4 3 5 2 5
单词的属性值
int 指向x的符号表入口指针
词法分析在实际操作中:
对于每种语言,保留字、运算符和界限符 是固定的,可以“一字一类”或“一符一 类”,预先造好标准单词表。
例如: 单词
…… IF THEN ELSE …… FOR ……
内部编码 …… 3 4 5 …… 19 ……
单词 …… + -
* ……
> ……
内部编码 …… 24 25 26 …… 34 ……
图 2.5 词法分析过程GETSYM
PL/0编译程序文本中主程序开始对关键字表置初 值如下(P304 ) : 关键字表为: word[1]:='begin ';word[2]:='call '; ... word[13]:='write '; 查到时找到关键字相应的内部表示为: Wsym[1]:=beginsym;
要其它一些信息以便编译的进行。
比如,对于标识符来说,还需要记载它的类别、层 次还有其它属性,如果这些属性统统收集在符号 表中,那么可以将单词的二元式表示设计成如下 形式
(标识符,指向该标识符所在符号表中位置的指针)
如上述语句中的单词i和yes的表示为: (标识符,指向i的表项的指针) (标识符,指向yes的表项的指针)
相关文档
最新文档