网站大量收购独家精品文档,联系QQ:2885784924

第3章 词法分析.ppt

  1. 1、本文档共133页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第3章 词法分析 VT在词法分析和语法分析中代表不同单位: 词法分析阶段输入的最小单位是单个字符,输出是单词 语法分析阶段输入的最小单位是单词,输出是语法树 词法分析器(Lexical Analyzer) 又称扫描器(Scanner) 编译程序首先是在单词级别上来分析和翻译源程序的。词法分析是编译的基础 词法分析的任务是: 从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序 1 对于词法分析器的要求 2 词法分析器的设计 3 正规表达式与有限自动机 4 词法分析器的自动产生 词法分析器的功能和输出形式 功能:输入源程序、输出单词符号 单词符号的种类: 基本字:如begin,repeat,… 标识符--表示各种名字:如变量名、数组名和过程名 常数:各种类型的常数 运算符:+,-,*,/,… 界符:逗号、分号、括号和空白 词法分析器的功能和输出形式 词法分析器输出的单词符号常常表示为二元式: (单词种别,单词符号的属性值) 单词种别 单词符号如何分种取决于处理上的方便 标识符一般归为一种 常数按类型分种(整、实、布尔等) 关键字可将其全体视为一种,也可以一字一种 运算符可采用一符一种的分法,也可把具有共性的运算符视为一种 界符一般用一符一种的分法 词法分析器的功能和输出形式 词法分析器输出的单词符号常常表示为二元式: (单词种别,单词符号的属性值) 单词种别 如果一个种别只含有一个单词符号,则种别编码就完全代表这个单词符号 如果一个种别含有多个单词符号,则每个单词符号除了种别编码之外,还应给出属性信息 词法分析器的功能和输出形式 词法分析器输出的单词符号常常表示为二元式: (单词种别,单词符号的属性值) 单词符号的属性值 单词符号的属性是指单词符号的特征或特性 例如: 对于标识符,将符号表项的指针作为其属性值 对于常数,将常数表项的指针作为其属性值 词法分析器的功能和输出形式 举例: C++代码段 while (i=j) i--; 经词法分析器处理后,转换为如下的单词符号序列: while,- (,- id,指向i的符号表项的指针 =,- id,指向j的符号表项的指针 ),- id,指向i的符号表项的指针 --,- ;,- 词法分析器的功能和输出形式 举例: FORTRAN程序:IF (5.EQ.M) GOTO 100 输出单词符号: 逻辑IF (34,-) 左括号 (2,-) 整常数 (20,‘5’的二进制) 等号 (6,-) 标识符 (26,‘M’) 右括号 (16,-) GOTO (30,-) 标号 (19,‘100’的二进制) 词法分析器作为一个独立子程序 词法分析是一个独立的阶段,但一般不将其作为一遍 作为独立阶段的优点: 结构简洁、清晰和条理化,有利于集中考虑词法分析一些枝节问题 不作为一遍: 我们可以把词法分析器安排成一个独立子程序 当语法分析器需要单词符号时就调用这个子程序 由于2型文法可以识别所有3型文法产生的语言 理论上,词法分析的工作可以交由语法分析完成 现实中,这样做要考虑很多无关因素,偏离了语法分析的主要工作 后面的讨论中,假定词法分析器是按这种方式工作的 词法分析器作为一个独立子程序 词法分析器 1 对于词法分析器的要求 2 词法分析器的设计 3 正规表达式与有限自动机 4 词法分析器的自动产生 词法分析器的结构 输入、预处理 源程序的输入 输入缓冲区: 源程序以文件形式存于外存,首先要将其读入内存的输入缓冲区才可进行词法分析 分段读入处理(早期) 早期计算机内存较小,只能在内存设置长度有限的缓冲区,分段读入源程序进行处理 编制程序要考虑由于源程序分段读入所产生的问题 例如:太长的单词有可能被缓冲区边界所打断 全部读入后处理 目前计算机所使用的的内存足以容纳全部的源程序,可一次全部读入内存进行处理 输入、预处理 源程序的输入 举例:设源程序如下所示,其中‘\’为续行符: 源程序读入后,输入缓冲区的内容如下所示: 输入、预处理 预处理 输入串放入输入缓冲区后就可以识别单词,但若把源程序预处理一下,则单词识别就比较容易,原因如下: 目前使用的程序设计语言大都采用自由格式书写,允许在单词之间存在多余的空格、换行和制表符(TAB) 源程序通常带有注释,注释不是程序的必要组成部分 有些语言还提供续行功能(例C语言中的续行符\),当一个单词过长(例字符串常数),可分多行列出 对于Fortran和Cobol之类语言,源程序还受到书写格式的限制 输入、预处理 预处理 预处理的主要工作包括: 删除注释 删除续行符(如C语言中的”\”),以及后续换行符 将换行符和TAB统一替换为空格 大多数语言(除C语言外)不区分大小写,预处

文档评论(0)

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

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

1亿VIP精品文档

相关文档