编译原理实践 词法分析程序的自动生成器LEX
编译原理实践 --词法分析程序的自动生成器LEX
畚由于各种高级程序设计语言的单词形式 基本上可以用一组正规式来描述,人们 就希望能否构造一个自动生成系统,只 要给出程序设计语言的各类单词描述以 及识别出各类单词后应输出的结果,这 种自动系统便能自动产生此程序设计语 言的词法分析程序 Lex就是这样一个工具,他将正规式转换 为一个NFA,进而转换为相应的DFA, 这个DFA可以识别该正规式所表示的语 言的句子
由于各种高级程序设计语言的单词形式 基本上可以用一组正规式来描述,人们 就希望能否构造一个自动生成系统,只 要给出程序设计语言的各类单词描述以 及识别出各类单词后应输出的结果,这 种自动系统便能自动产生此程序设计语 言的词法分析程序 Lex就是这样一个工具,他将正规式转换 为一个NFA,进而转换为相应的DFA, 这个DFA可以识别该正规式所表示的语 言的句子
LEX筒单的介绍 1 LEX(lexical analyzer generator 个词法分析程序的自动生成器 LEX是1972年贝尔实验室首先在 UNIX上实现的 2 FLEX(fast lexical analyzer generator)是对LEX的扩充它可在 MS-DOS下运行.我们这里实际使用 的是FLEX,但仍称呼为LEX
LEX简单的介绍 1 LEX(lexical ananlyzer generator) 一个词法分析程序的自动生成器. LEX是1972年贝尔实验室首先在 UNIX上实现的. 2 FLEX(fast lexical ananlyzer generator) 是对LEX的扩充,它可在 MS-DOS下运行. 我们这里实际使用 的是FLEX,但仍称呼为LEX
)LEX简单的介绍 LEX能根据给定的正则表达式自动生成 相应的词法分析程序 输入是用LEX语言写的源程序 生成:用C语言描述的词法分析程序 LEX生成的目标程序包含一个状态转换 矩阵和一个控制执行程序
LEX简单的介绍 • LEX能根据给定的正则表达式自动生成 相应的词法分析程序 • 输入:是用LEX 语言写的源程序 • 生成:用C语言描述的词法分析程序 • LEX生成的目标程序包含一个状态转换 矩阵和一个控制执行程序
③LEX使用流程 使用LEX的流程如图 LEX源程序 LEⅩ YYLEX. C YYLEX. C C编译器 YYLEⅩ,EⅩE 字符串源程序 YYLEX. EXEH符号串源程序 LEX源程序是使用LEX语言编写的词法规则说明,经过LEⅩ 翻译后形成目标文件 YYLEX. C;再用C编译器对 YYLEX.C进 行翻译,生成目标程序 YYLEX. EXE,它就是词法分析程序用 YYLEⅩEXE就可以将字符串源程序转换成符号串源程序
LEX使用流程 使用LEX的流程如图: LEX源程序 LEX YYLEX.C YYLEX.C C编译器 YYLEX.EXE 字符串源程序 YYLEX.EXE 符号串源程序 LEX源程序是使用LEX语言编写的词法规则说明,经过LEX 翻译后形成目标文件YYLEX.C;再用C编译器对YYLEX.C进 行翻译,生成目标程序YYLEX.EXE,它就是词法分析程序,用 YYLEX.EXE就可以将字符串源程序转换成符号串源程序
用LEX语言表达正则表达式 LEX的输入是LEX源程序 首先介绍如何表示正则表达式 LEX表示正则表达式时采用一些元字符*+() ]|{}”"等,表示方法如下 (1)对于单个的字母a就直接表示成a如a,+,等 (2)[abC]表示字符ab,或c中的任一个,如[01] 表示0或1 (3)[a-d]表示字符ab,C或d中的任一个 (4)[^ab]表示除了a或b外的任一个字符
用LEX语言表达正则表达式 LEX的输入是LEX源程序. 首先介绍如何表示正则表达式. LEX表示正则表达式时采用一些元字符* + ( ) \ [ ] | { } “ “等,表示方法如下. (1)对于单个的字母a,就直接表示成a,如a,+,-等 . (2)[abc]表示字符a,b,或c中的任一个,如[01] 表示0或1 (3)[a-d]表示字符a,b,c或d中的任一个. (4)[^ab]表示除了a或b外的任一个字符
)用LEX语言表达正则表达式 (5).表示除了换行符之外的任一个字符 (6)"text"表示双引号里的每个字符(包括元字符)都按 字符处理,如"ab[01]"就是表示ab[01]是字符串,其中 的[和]不是元字符 (7)\转义字符 (8){XXX名字XXX表示的正则表达式。 (9)r|s表示正则表达式r或正则表达式S (10)rs表示正则表达式r与正则表达式s的连接
用LEX语言表达正则表达式 (5). 表示除了换行符之外的任一个字符. (6)”text”表示双引号里的每个字符(包括元字符)都按 字符处理,如”ab[01]”就是表示ab[01]是字符串,其中 的[和]不是元字符 (7) \ 转义字符 (8){xxx}名字xxx表示的正则表达式。 (9)r|s表示正则表达式r或正则表达式s。 (10)rs表示正则表达式r与正则表达式s的连接
)用LEX语言表达正则表达式 (11)(r)表示(内的优先级高于括号外。 (12)r*表示正则表达式r可重复零次或多次。 (13)r+表示正则表达式可重复一次或多次。 (14)?表示是一个可选的正则表达式。 (15)r{m,n}其中m,n是正整数,表达正则表达式r的 m~n次重复。 (16)r{m}表示正则表达式r的m次重复。 (17)r{m,}表示正则表达式r的m到多次的重复 (18)^行的开始,$行的结尾
用LEX语言表达正则表达式 (11)(r)表示()内的优先级高于括号外。 (12)r*表示正则表达式r可重复零次或多次。 (13)r+表示正则表达式r可重复一次或多次。 (14)r?表示r是一个可选的正则表达式。 (15)r{m,n}其中m,n是正整数,表达正则表达式r的 m~n次重复。 (16)r{m}表示正则表达式r的m次重复。 (17)r{m,}表示正则表达式r的m到多次的重复。 (18)^行的开始,$行的结尾
用EX语言表达正则表达式 例 1)二进制数 (0|1)* 2)以a或b开头的由a和b任意组成的字符串 (aa bb(a b o(aa bb[] 3)任何一个从0~9的数字 [0-9 4)长度不超过8的小写字符串 [a-z]{1,8}
用LEX语言表达正则表达式 例: 1)二进制数 (0|1)* 2)以aa或bb开头的由a和b任意组成的字符串 (aa|bb)(a|b)*或(aa|bb)[ab]* 3) 任何一个从0~9的数字: [0-9] 4)长度不超过8的小写字符串 [a-z]{1,8}
用LEX语言表达正则表达式 5)无符号整数 [0-9]+ 6)可带小数点的有符号数 C+“|″-")?[0-9]+(.”[0-9]+ 7)可带指数的有符号数 +""-")?[0-9]+(.[0-9]+)?(EC+"-)?[0-9]+)? 8)标识符:字母或开头,后跟字母数字、下划线等字符 [a-zA-Z](a-zA-z]|[0-9])* 9)空白区 [\t\n]+
用LEX语言表达正则表达式 5) 无符号整数 [0-9]+ 6)可带小数点的有符号数 (“+”|”-”)?[0-9]+(“.”[0-9]+)? 7) 可带指数的有符号数 (“+”|”-”)?[0-9]+(“.”[0-9]+)?(E(“+”|”-”)?[0-9]+)? 8)标识符:字母或_开头,后跟字母数字、下划线等字符 [a-zA-Z_]([a-zA-Z_]|[0-9])* 9)空白区 [ \t\n]+