编译原理-第三章.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理-第三章

TJNU-COCIE-WJW 编译原理 ——第三章 词法分析 王金伟 计算机与信息工程学院 天津师范大学 第三章 词法分析 3.1 对于词法分析器的要求 3.2 词法分析器的设计 3.3 正规表达式与有限自动机 3.4 词法分析器的自动产生(LEX) 词法分析的任务 从左至右逐个字符的对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为由单词符号串组成的程序 词法分析器:执行词法分析的程序 输入:源程序 输出:单词符号 词法分析器的构造方法 手工方法:根据词法直接编程序(有限自动机) 自动方法:利用一些工具Lex 3.1 对词法分析器的要求 源程序 ? 词法分析器 ? 单词符号 1.单词符号概念 指语言中具有独立意义的最小的语法符号 例:C = A * 3.14 + 5 单词: C,A ——变量 3.14, 5 ——常数 = ,*,+ ——算符 2.单词的种类 (1)基本字(保留字,关键字) 由程序语言定义的具有固定意义的标识符。 用户不能用来表示变量名,函数名等标识符 例:C语言中的“if” “else” “while” … (2)标识符 用户使用的,用来表示各种名字,变量名,函数名等 2.单词的种类(续) (3)常数 整型、实型、逻辑、字符… 例:1000,3.14,TRUE,“Abcd” (4)运算符 +、-、*、/ … (5)界符 , ; { } ()… 词法分析器输出的单词符号常常用二元式来表示: 单词种别,单词符号的属性值 1. 单词种别 通常用整数编码来表示 (1)关键字,运算符,界符 一字一种编码(处理起来比较方便) 例:if,else,‘(’,‘+’,… (2)常数 按类型分别给出编码 例:整型,实型,布尔型,… (3)标识符 统归一种,只给一个编码 例:变量名,函数名等都是一种编码 1. 单词种别(续) 注意: (1)若一个种别只包含一个单词符号(一种一字),对于该单词符号,种别编码就可以代表它自身了。 例如:关键字,运算符,界符 (2)若一个种别包含有多个单词符号(一种多字),对于该种别的每个单词符号,除了给出种别编码,还需给出单词符号的属性值 例如:整型常数,实型常数,布尔常数,标识符 2.单词符号的属性信息 单词符号的属性:指单词符号的特性或特征 单词符号的属性值:反映单词特性或特征的值 2.单词符号的属性信息(续) 属性值的表示方法: (1)基本字,运算符,界符(一字一种) 只给其种别编码,不给出它的属性值 例:基本字while表示成: $WHILE, - (2)常数 表示成标准的二进制形式 例:1024表示成:$CONST, 1024的二进制表示 (3)标识符 用字符串编码或对应的符号表项地址 例:name表示成:$ID,“name” 或$ID, 指向name的符号表项的指针 例1:FORTRAN编译程序的词法分析器,在扫描输入串: IF (5. EQ .M) GOTO 100 输出的单词如下: 单词符号 单词种别编码,单词符号的属性值 IF 34,- 左括号 2 ,- 整常数 20,5的二进制表示 等号 6 ,- 标识符 26,‘M’ 右括号 16,- GOTO 40,- 标号 19,‘100’二进制表示 例2:考虑下面C++的一段代码: while ( i = j) i--; 经词法分析器处理后,将被转换成如下单词符号序列: 单词符号 单词种别编码,单词符号的属性值 while while,- ( ( ,- i id,指向i的符号表项的指针 = = ,- j id,指向j的符号表项的指针 ) ),- i id,指向i的符号表项的指针 -- --,- ; ; , - 3.2 词法分析器的设计 1. 输入缓冲区、预处理子程序 (1)输入源程序文本,放入输入缓冲区中,词法分析工作可在这个输入缓冲区中工作 (2)剔除无用的空白,跳格(TAB),回车,换行等编辑性字符;若空白符号为单词符号的界符,就将若干空白和并为1个 (3)剔除注释行,比如/*…*/ (4)如果是FORTRAN语言,区分标号区、续行区和给出句末符 (5)源程序的出错列表打印 (6)将预处理好的子程序放到扫描缓冲区中 2.扫描缓冲区、扫描器 (1)扫描缓冲区 设两个半区,可互补使用 设两个指针 起点指针:指出正在识别单词起点位置 搜索指针:向前搜索以寻找单词终点 (2)扫描器:扫描缓冲区,直接进行单词的

文档评论(0)

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

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

1亿VIP精品文档

相关文档