📜  Lex程序接受有效的整数和浮点值(1)

📅  最后修改于: 2023-12-03 14:43:53.286000             🧑  作者: Mango

Lex程序接受有效的整数和浮点值

在Lex中,我们可以使用正则表达式来定义词法规则(也称为词法模式),通过匹配输入的记号来识别有效的整数和浮点值。Lex程序会将输入分割为一系列词法记号,可以在后续阶段进一步处理这些记号。

定义词法规则

我们首先需要定义一些正则表达式来匹配我们想要识别的整数和浮点值的模式:

%{
#include <stdio.h>
%}

DIGIT [0-9]
INT {DIGIT}+
FLOAT {DIGIT}+"."{DIGIT}+

%%

{INT}|{FLOAT}   { printf("Valid number: %s\n", yytext); }
.|\n            ; // 忽略其他输入

%%

int main() {
    yylex();
    return 0;
}

在上面的示例中,我们使用%{ ... %}包含一些额外的C代码。在此部分,我们包含了stdio.h库,以便在识别有效数字时打印一条消息。

接下来,我们定义了三个正则表达式:

  • DIGIT表示一个数字,可以是0到9之间的任意数字。
  • INT表示一个整数,由一个或多个数字组成。
  • FLOAT表示一个浮点值,由一个或多个数字、一个小数点和一个或多个数字组成。
定义模式和动作

在Lex程序的主体部分,我们使用%%分隔定义模式和动作的部分。

定义模式和动作的语法如下所示:

<模式>   { <动作> }

我们使用{INT}|{FLOAT}作为模式,在输入中匹配到整数或浮点值时,将执行相应的动作。动作中的yytext变量表示与模式匹配的输入字符串。

我们的动作非常简单,只是在控制台打印一条消息,说明我们找到了一个有效的数字。

其他词法规则

在示例中,我们还定义了一个简单的词法规则来忽略除整数和浮点数之外的任何输入。.|\n表示匹配任何字符(除了换行符),然后跳过它。

主函数

Lex程序的主函数是main(),在其中调用了yylex()函数来开始分析输入。

编译和运行

要编译我们的Lex程序,我们需要使用Flex工具。假设我们将源代码保存在一个名为valid_numbers.l的文件中,我们可以按照以下步骤进行编译和运行:

  1. 使用Flex编译工具生成C代码:flex valid_numbers.l
  2. 编译生成的C代码:gcc lex.yy.c -o valid_numbers
  3. 运行程序并输入一些数字:./valid_numbers

输入有效的整数和浮点数后,程序将打印出相应的消息。

结论

通过Lex程序,我们可以轻松识别并处理输入中的有效整数和浮点数。通过扩展词法规则,我们可以实现更复杂的词法分析。LEX提供了强大和灵活的工具,可以帮助我们构建各种语法分析器。