- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二部分GCC词法分析.doc
第三部分:GCC词法分析程序
琚 小 明
浙江大学信息与通信工程学系 2002年7月
一、词法分析程序的主要功能
词法分析程序的输入(即其扫描的源程序文件)是预处理程序程序的输出,预处理的输出是放在一个缓冲区内,词法分析程序将从该缓冲区内读取字符作为自己的输入。
词法分析是编译的第一阶段,它的主要任务是从左到右逐个字符地对源程序文件进行扫描,产生一个个单词序列,用以语法分析。执行词法分析的程序称为词法分析程序或扫描程序。
词法分析程序可由词法产生器LEX产生或是人工编写,在GCC中,词法分析程序是人工编写的,因此GCC的词法分析程序具有较好的可读性。它主要包含c-lex.c,c-lex.h文件以及相关的文件,其主要功能由函数yylex实现。从预处理的输出文件中一个一个地读取字符,按照尽可能大的原则组成单词(token),组成的单词是放在单词的输出缓冲中。对数字常量、字符常量等,为其建立节点,并使yylval.ttype指向此节点,返回单词的值(value)。其中单词的属性值是通过结构变量yylval.ttype, yylval.code, yylval.itype 返回的。
GCC的词法分析程序将单词分成6类:
1. 标识符:包括关键字和自定义标识符。由字母(a-z, A-Z)、下划线“_”和“@”开头,以及数字组成的单词。组成单词后首先判别该单词是否是关键词,若是则写相应的属性值。若不是关键词,则该单词是用户自定义的标识符,为其建立一个节点,并添加到链表中。
2. 数字。由数字“0-9”组成的单词。其中又可分为16,10,8进制,且有浮点和非浮点之分。
3. 字符常量。单引号包含的字符常量。
4. 字符串常量。由双引号包含的字符串常量。当由L开头的字符串常量(L “……”)为宽字符串(wide-string)常量。
5. 运算符。包括算术运算符和逻辑运算符以及指针运算符。“+”、“-”、“”、“|”、“”、“”、“*”、“/”、“%”、“^”、“!”、“=”、“++”、“--”、“”、“||”、“”、“”、“-”。
6. 其它。如: “{”、“[”等。
二、词法分析程序的流程图及其说明
在GCC中,词法分析程序是一个子程序,每当语法分析程序需要一个单词时,则调用该子程序。词法分析程序每被调用一次,便从源程序文件读入一些字符,直至识别出一个单词,或说是直至下一个单词的第一个字符为止。GCC的词法分析程序是通过调用c的标准库函数getc (finput),ungetc (c, finput) 来实现从源程序文件读取字符到单词的缓冲区及将字符放回到输入源程序文件的。
词法分析程序的构词原理示意图如下:(见图1)
词法分析程序的流程图及其说明:(见图2)
词法分析程序的功能主要由函数yylex来实现,yylex调用标准库函数getc从源程序文件中逐个读取字符,该源程序文件是GCC预处理的输出文件,并对该字符进行分析处理。
首先函数yylex判别读入的字符是否为转义字符,如:’\t’, ‘\f’, ‘\v’, ‘\b’等,若是转义字符,则跳过转义字符,然后再从源程序文件中读取字符。接着判别该字符是否为’\n’, ‘/’, ‘\\’等,若是则调用函数skip_white_space取得新字符。将读入的字符暂时放在临时变量中,并对该字符进行分析处理。
在词法分析程序的流程图中,将可能组成单词字的符分成八种情况分析处理,以下分别对每种情况作简要的说明。
EOF是源程序文件的结束符号。当词法分析程序读到该字符时,就认为对源程序文件的扫描工作结束了,也可以说是词法分析结束了。
‘L’是宽字符常量或是宽字符串常量的起始标志。如果L后是‘\’’,则是宽字符常量。如果L后是‘”’,则是宽字符串常量。
‘$’是美元符号。如果标志位被置1,则它作为组成标识符的的字符元素,否则返回‘$’。
由字符‘A-Z’,‘a-z’,‘-’(‘$’),开始的单词是标识符。调用函数is_reserved_word函数在关键字(或保留字)表中查找此标识符是否存在,若找到则该标识符为保留字。否则为用户自定义的标识符,调用函数get_identifier在hash table 中查找该标识符,如果找到则返回指向此节点的指针,否则调用函数make_node建立一个节点,返回此节点的指针。
由数字‘0-9’,‘.’开始的单词构成各种数,包括整数,实数,指数,浮点数,复数等,有八进制,十进制和十六进制以及由‘u’,‘l’,‘U’,‘L’修饰的数。
由‘\’’开始的单词是字符常量,即由单引号包含的字
文档评论(0)