什么是 LEX?
它是一个工具或软件,可以自动生成一个词法分析器(有限自动机)。它以 LEX 源程序作为输入,并生成词法分析器作为输出。词法分析器将用户输入的字符串转换为标记作为输出。
LEX 是一个为字符输入/输出流的词法处理而设计的程序生成器。任何东西,从查找其输入/输出文件中模式的简单文本搜索程序到将程序转换为优化代码的C 编译器。
在具有结构化输入输出的程序中,会反复执行两个任务。它可以将输入输出划分为有意义的单元,然后发现这些单元之间的关系,例如C 程序(这些单元是变量名、常量和字符串)。这种划分为单元(称为标记)的过程称为词法分析或 LEXING。LEX 通过获取一组可能的标记描述并生成称为词法分析器或 LEXER 或扫描器的例程来提供帮助。
LEX 源程序
它是一种用于指定或表示词法分析器的语言。
LEX 源程序有两个部分:
- 辅助定义
- 转换规则
- 辅助定义
它表示形式为正则表达式的形式。
不同的名称 $\begin{bmatrix}D_{1} & =\:\:R_{1} \\D_{2} & =\:\:R_{2} \\D_{n} &= \:\:R_{n} \end{bmatrix}$ 正则表达式
其中
不同的名称 (Di) → 正则表达式的简写名称
正则表达式 (Ri) → 表示输入符号集合的表示法。
示例
标识符的辅助定义:
带符号数字的辅助定义
integer=digit digit*
sign = + | -
signedinteger = sign integer
十进制数字的辅助定义
decimal = signedinteger . integer | sign.integer
指数数字的辅助定义
Exponential – No = (decimal | signedinteger) E signedinteger
实数的辅助定义
Real-No. = decimal | Exponential – No
- 转换规则
它是一组规则或动作,告诉词法分析器在遇到标记时必须做什么或必须返回给解析器什么。
它由以下形式的语句组成:
P1 {Action1} P2 {Action2} . . . Pn {Actionn}
其中
**Pi** → 由输入字母和辅助定义名称组成的模式或正则表达式。
**Actioni** → 每当识别出一个标记时,就会执行一段代码。每个 Actioni 指定每当正则表达式或模式 **Pi** 与输入字符串匹配时要执行的一组语句。
示例
“关键字”的转换规则
我们可以看到,如果词法分析器得到输入“begin”,它将识别标记“begin”,并且词法分析器将返回 1 作为整数代码给解析器。
“标识符”的转换规则
letter (letter + digit)* {Install ( );return 6}
如果词法分析器得到一个“标识符”标记,则词法分析器采取的操作是在符号表中安装或存储名称,并返回 6 作为整数代码给解析器。