第2讲--词法范例.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
CompilerPrinciples 第二讲 词法分析 词法分析器的构造 正规表达式与有穷自动机 词法分析器的自动产生 §1.词法分析器的构造 编译程序首先在单词级别上来分析和翻译源程序。词法分析的任务是:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号,即把作为字符串的源程序改造成为单词符号串的中间程序。因此,词法分析是编译的基础。执行词法分析的程序称为词法分析器 通常又称为扫描器,scanner)。 一、一般考虑: 1.词法分析程序的主要任务: 读入字符串形式的源程序—输入 剔除非单词符号—空格、换行,注释 宏展开,…… 拼单词符号—**、: 、FOR、BEGIN等 源程序的列表输出 行号 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.对半互补缓冲区 分析器对扫描缓冲区进行扫描时一般使用两个指示器,一个指向当前正在识别单词的开始位置(指向新单词的首字符),另一个用于向前搜索以寻找单词的终点。 但是不论扫描缓冲区设得多大都不能保证单词符号不会被缓冲区的边界所打断。 因此,扫描缓冲区最好使用一分为二的区域,并使两区首尾相接,形成一个对半互补缓冲区。 例如: 为了从1、2中识别出关键字DO和IF,我们必须要能够区别1、3和区别2、4。语句1、3的区别在于等号之后的第一个界符:一个为逗号,另一个为小数点,语句2、4的主要区别在于右括号后的第一个字符:一个为字母,另一个为等号。这就是说,为了识别 1、2句中的关键字,我们必须超前扫描许多个字符,超前到能够肯定词性的地方为止。 这种向前扫描若干字符直到找到能区分单词的字符为止的技术就叫超前搜索。 单一符号运算符和复合运算符: 4. 词法错误 如果没有其他组件的帮助,词法分析器很难发现源代码中的错误。 [例]在TurboC下运行下面的C程序 1 int main 2 int x 3 ; 3 if x%2 0 /* even numbe

文档评论(0)

ddf55855 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档