2第二章 词法分析1.pdfVIP

  • 4
  • 0
  • 约1.06万字
  • 约 31页
  • 2018-10-19 发布于山东
  • 举报
第2章 词法分析 主要内容 扫描处理 正则表达式 有穷自动机 从正则表达式到DFA TINY扫描程序的实现 利用Lex 自动生成扫描程序 • 编译器的扫描或词法分析(lexical analysis )从源代码中读取字符并形成记号 (token )用于编译器的后续部分处理。记 号表示源程序中信息单元的字符序列。将 字符组合成记号与在英语句子中将字母构 成单词并确定含义很像,扫描任务类似拼 写。 • 扫描程序问题分为以下部分: 给出扫描程序操作概貌以及涉及的结构和概念 正则表达式(用于表示构成程序设计语言的词法 结构的串格式的标准表示法) 有穷状态机器或称有穷自动机(对由正则表达式 给出的串格式的识别算法) 用正则表达式构造有穷自动机 编写有穷自动机表示识别过程的程序 TINY语言扫描程序的完整实现过程 自动产生扫描器生成器的过程和方法(使用Lex 实现TINY的扫描程序,适用于Unix和其他系统的 标准扫描生成器) 主要内容 扫描处理 正则表达式 有穷自动机 从正则表达式到DFA TINY扫描程序的实现 利用Lex 自动生成扫描程序 • 一、记号的数据结构: • 第1类:保留字(reserved word )、关键字(key word ),是字母的固定串,如IF和THEN,表示字符串 “ if”和“ then”;特点是某种具体语句的保留字是已知的且 一个单词就只有一个词义。因此可以采用一个单词一个 码。 • 第2类是特殊符号(special symbol ),如算术符号加 (PLUS )和减(MINUS ),它们表示字符“ +”和“-” 。 一些多字符符号,如 = 和 。这类记号的特点类似第 类。也可采用一个单词一个码。 • 第3类是表示多字符串的记号,如456和var1 、number, 它们分别表示数字和标识符(identifier )。这类记号的 点是未知的,只给出组成规则(例如标识符是由用户定义 的串,字母开头,后面可跟若干个字母或数字符号),一 个单词在不同的程序中其词义可以不同。只能采用统一编 码,即多个单词采用同一个编码。 • 记号的编码可定义为枚举类型的逻辑项。记号在C中可被定义为: typedef enum { IF, THEN, ELSE,PLUS, MINUS, NUM, ID, ... } TokenType ; • 为了区分作为逻辑项的记号与对应的字符串,方便确定具体的单词值(即串 值属性),通常在C中定义这样的记号记录(token record )说明为: typedef struct { TokenType tokenval; char * stringval; int numval; } TokenRecord; 或可能作为一个联合 typedef struct { TokenType tokenval; union { char * stringval; int numval; } attribute; } TokenRecord; (以上假设只有标识符需要串值属性,只有数字需要数值属 性)。 • 二、扫描程序的主控函数 扫描程序任务将整个源程序转换为记号序列,很少一次性 地完成。实际是在分析程序的控制下操作的,通过函数从 输入中返回有关命令的下一个记号,该函数有与C说明相 似的说明: TokenType getToken( void ); getToken函数在调用时从输入中返回下一个记号并计算诸 如记号串值这样的附加属性。输入字符串通常不给这个函 数提供参数,但参数却被保存在缓冲区中或由系统输入设 备提供。例如:分析代码:a [ index ] = 4 + 2 • 假定将这个代码行放在一个输入缓冲区中,它的下一个输 入字符由箭头指出,如下所示: • 一个对getToken的调用现在需要跳过下面的4个空格,识 别由单个字符a 组成的串“

文档评论(0)

1亿VIP精品文档

相关文档