- 1、本文档共84页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]编译原理课件
第二讲 词法分析;§1.词法分析器的构造;一、一般考虑:;
2.词法分析器的输入和输出形式
输入—字符串形式的源程序
输出—单词符号串。
程序语言的单词符号一般分为五种:
关键字、运算符、界符、标识符、常数
词法分析器输出的单词符号常常表示为二元式:
(单词种别,单词符号的属性值)
;
★单词种别通常用整数编码
单词种别是对单词符号的一种分类。一个语言的单词符号如何分种,分成几种,怎样编码是一个技术性问题。它取决于处理上的方便。标识符一般统归为一种。常数则宜按类型(整、实、布尔等)分种。关键字可视其全体为一种,也可以一字一种。采用一字一种的分法实际处理起来较为方便。运算符可采用一符一种的分法,但也可以把具有一定共性的运算符视为一种。至于界符一般用一符一种的分法。
;★单词符号属性信息记录单词符号的特征或特性
如果一个种别只含有一个单词符号,那么对于这个单词符号,种别编码就完全代表它自身了,因此属性值就没有意义了。若同一个种别含有多个单词符号,那麽,对于它的每个单词符号,除了给出种别编码之外,还应给出各有关单词符号的属性信息。
属性值是反映特性或特征的值。例如,对于某个标识符,常将存放它有关信息的符号表项的指针作为其属性值;对于某个常数,则将存放该常数二进制表项的指针作为其属性值。; 作为例子考虑下述C++语句:
while (i=j) i- -;
若while种别为01,(种别为11,标识符种别为20,=种别为12,)种别为13,--种别为14,;种别为30,则经词法分析器处理后,它将被转换为如下的单词符号序列:
( 01, — )
( 11, — )
( 20 ,指向i的符号表项的指针 )
( 12 , — )
( 20 ,指向j的符号表项的指针 )
( 13 , — )
( 20 ,指向i的符号表项的指针 )
( 14 , — )
( 30 , — );3.词法分析器与语法分析器的衔接
通常把词法分析器安排成一个独立子程序,
而不是单独的一遍。这样一来,就无须在外存中
保留整个源程序的内码形式,而是每当语法分析
器需要单词符号时就调用这个子程序。每一次调
用,词法分析器就从源程序字符串中识别出一个
单词符号,把它交给语法分析器。这样做的好处
是:
压缩编译时扫描字符的时间:编译时大量时间花费在字符的扫描上;
词法规则描述简单,便于建立扫描器的自动方法,便于独立研究;
使得语法分析获得更多信息;
便于处理同一语言的几种不同表示形式;
;由以上考虑,可以初步设计为:;二、进一步考虑:
1. 输入、预处理
词法分析器工作的第一步是输入源程序文本。输入串一般放在一个缓冲区中,这个缓冲区称源程序输入缓冲区。词法分析器的工作可以直接在这个缓冲区中进行。但在许多情况下,把输入串预处理一下,对单词符号的识别工作将是比较方便的。
预处理工作包括对空白符、跳格符、回车符和换行符等编辑性字符的处理,及删除注解等。于是可以设想构造一个预处理子程序,它完成上面的工作。每当词法分析器调用它时就处理出一串确定长度的输入字符,并将其装入词法分析器所指定的缓冲区中(称为扫描缓冲区)。这样分析器就可以在此缓冲区中直接而方便地进行单词符号的识别工作。;2.对半互补缓冲区
分析器对扫描缓冲区进行扫描时一般使用两个指示器,一个指向当前正在识别单词的开始位置(指向新单词的首字符),另一个用于向前搜索以寻找单词的终点。但是不论扫描缓冲区设得多大都不能保证单词符号不会被缓冲区的边界所打断。因此,扫描缓冲区最好使用一分为二的区域,并使两区首尾相接,形成一个对半互补缓冲区。
例如:每半个区可容64个字符,而这两个半区又是互补的。如果搜索指示器从单词起点出发搜索到半区的边缘但尚未达到单词的终点,那么就调用预处理子程序,令其把后续的64个字符装入另半区。可以认定在另半区一定可以达到单词的终点。这意味着标示符和常数的长度实际上必须加以限制,否则即使缓冲区再大也无济于事。;于是对半互补缓冲区可图示如下:
;单词符号;;; 所以为了区别1和3,必须超前扫描若干字符直到等号后的第一个界符处。对于2和4来说,同样需超前扫描到与IF后的左括号相对应的那个右括号之后的第一个字符为止。若此字符是字母,则得逻辑IF。若此字符为数字,则得算术IF。否则,应认为是用户自定义标识符IF。这种向前扫描若干字符直到找到能区分单词的字符为止的技术就叫超前搜索。
; 标识符的识别:标识符是
文档评论(0)