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