第2章词法分析 要点 利用Lex自动生成扫描程序
第2章 词法分析 要点 ◼ 利用Lex自动生成扫描程序
2.6利用Lex自动生成扫描程序 Lex简介 Lex代表 Lexical Analyzar 使用LEⅩ工具可根据描述语言的词法构成规 则的正规式来自动生成扫描程序。 ·LEX在unx平台上使用,在 windows平台上的 种常用实现是FLEX,它是 gnu compiler package的一部分
2.6 利用Lex自动生成扫描程序 • Lex 代表 Lexical Analyzar • 使用LEX工具可根据描述语言的词法构成规 则的正规式来自动生成扫描程序。 • LEX在unix平台上使用,在windows平台上的 一种常用实现是FLEX,它是GNU compiler package的一部分。 Lex 简介
词法分析器的自动产生_LEX Lex Source Lex lex.yy.c program compiler lex. I C lex. yy.c a out compiler Input sequence a out stream tokens
词法分析器的自动产生--LEX Lex compiler Lex source program lex.l lex.yy.c C compiler lex.yy.c a.out a.out Input stream sequence of tokens
261正则表达式的Lex约定(1) 正则表达式由符号组成,符号一般是字符和数字,但 Lex中还有一些特殊标记。 字符 含义 A-Z0-9, a-Z 构成了部分模式的字符和数字 匹配除Mn外的任意字符 用来指定范围 例如:A-Z指从A到Z之间的所有字符
正则表达式由符号组成,符号一般是字符和数字,但 Lex 中还有一些特殊标记。 2.6.1 正则表达式的Lex约定(1) 字符 含义 A-Z, 0-9, a-z 构成了部分模式的字符和数字 . 匹配除 \n外的任意字符 - 用来指定范围 例如:A-Z 指从 A 到 Z 之间的所有字符
261正则表达式的Lex约定(2) 字符 含义 个字符集合。匹配括号内的任意字符。 如果第一个字符是A那么它表示否定模式 例:[abC]匹配a,b,和c中的任何一个。 匹配0个或者多个上述的模式 *+? 匹配1个或者多个上述模式 匹配0个或1个上述模式。 匹配行尾
字符 含义 ◼ [ ] 一个字符集合。匹配括号内的任意字符。 ◼ 如果第一个字符是 ^ 那么它表示否定模式。 ◼ 例: [abC] 匹配 a, b, 和 C中的任何一个。 * 匹配0个或者多个上述的模式。 + 匹配1个或者多个上述模式。 ? 匹配0个或1个上述模式。 \n 匹配行尾 2.6.1 正则表达式的Lex约定(2)
261正则表达式的Lex约定(3) 字符含义 $作为模式的最后一个字符匹配一行的结尾。 {}表示重复(如果它们括起来的是数字)或 定义的表达式(如果它们括起来的是一个名字) 例:A{1,3}表示A可能出现1次或3次。 digit}名字为digi的正则表达式 用来转义元字符。 用来覆盖字符在此表中定义的特殊意义,表示字符本意。 否定。 表达式间的逻辑或
字符 含义 $ 作为模式的最后一个字符匹配一行的结尾。 { } 表示重复(如果它们括起来的是数字)或 定义的表达式 (如果它们括起来的是一个名字) 。 例: A{1,3} 表示 A 可能出现1次或3次。 {digit} 名字为digit的正则表达式 \ 用来转义元字符。 用来覆盖字符在此表中定义的特殊意义,表示字符本意。 ^ 否定。 | 表达式间的逻辑或。 2.6.1 正则表达式的Lex约定(3)
261正则表达式的Lex约定(4) 字符 含义 “”字符的字面含义。用于元字符。 向前匹配。 如果在匹配的模版中的“/”后跟有后续表达式, 只匹配模版中“/”前面的部分。 例:输入A01,那么在模版A0/1中的A0是匹配的。 a本身。 专用于Lex源程序的段间分割符
字符 含义 “” 字符的字面含义。用于元字符。 / 向前匹配。 如果在匹配的模版中的“/”后跟有后续表达式, 只匹配模版中“/”前面的部分。 例:输入 A01,那么在模版 A0/1 中的 A0 是匹配的。 ( a) a本身。 % 专用于Lex源程序的段间分割符 2.6.1 正则表达式的Lex约定(4)
正则表达式举例 正则表达式 含义 elrs 匹配 jokes或 joker A{1,2}shis?匹配 Aashis, Ashis, AAshi,Ashi。 (A[b-e])+ 匹配以A开头、奇数位为A、偶数位为b~e之间的任 意字符且长度为大于0的偶数的串
正则表达式 含义 joke[rs] 匹配 jokes 或 joker。 A{1,2}shis? 匹配 AAshis, Ashis, AAshi, Ashi。 (A[b-e])+ 匹配以A开头、奇数位为A、偶数位为b~e之间的任 意字符且长度为大于0的偶数的串。 正则表达式举例
程序设计语言正则表达式举例 Lex中的标记声明类似c中的变量名。每个标记都有一个相关的表达式 标记 相关表达式 含义 数字(nat) ([0-9])+ 1个或多个数字 带符号数( signedNat)(“+”-”)?Nat带符号的整数 字符( chars) [A-Za-Z 1个任意字符 空格( blank) 个空格 字(word (chars)+ 1个或多个 chars 标识符(id)[A-Za-z][A-Za-z0-9*以字母开头后跟 任意字母或者数字
标记 相关表达式 含义 数字(nat) ([0-9])+ 1个或多个数字 带符号数(signedNat) (“+”|”-”)? Nat 带符号的整数 字符(chars) [A-Za-z] 1个任意字符 空格(blank) " " 一个空格 字(word) (chars)+ 1个或多个 chars 标识符(id) [A-Za-z][A-Za-z0-9]* 以字母开头后跟 任意字母或者数字 程序设计语言正则表达式举例 Lex 中的标记声明类似C 中的变量名。每个标记都有一个相关的表达式
2.6.2LEX输入文件的格式 LEX源程序由3个部分构成. 定义集 % 规则部分 辅助程序部分
2.6.2 LEX输入文件的格式 定义集 %% 规则部分 %% 辅助程序部分 LEX源程序由3个部分构成