什么是 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 作为整数代码给解析器。

更新于:2023年11月3日

25K+ 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告