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

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

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

简介

Lex 是一种词法分析器生成工具,它可以生成 C 语言代码,将输入的文本分解成一个个 token,用于后续语法分析。本程序是一个使用 Lex 工具编写的程序,可以接受有效的整数和浮点数并将它们识别出来。

实现
思路

为了识别输入中的数字,我们需要先了解数字的一些规则。这里以整数为例,整数主要有以下两个规则:

  1. 整数可以有多个数字,但不能出现小数点。
  2. 整数的第一位可以是 "-" 或数字。

那么,可以使用正则表达式来描述这个规则,比如:

-?[0-9]+

此正则表达式表示一个可选的负号,后跟一到多个数字。

而浮点数规则更加复杂一些,浮点数主要有以下两个规则:

  1. 浮点数可以包含小数部分,小数点左右必须有至少一位数字。
  2. 浮点数的第一位可以是 "-" 或数字。

我们可以结合整数规则来得到浮点数的正则表达式,如下:

-?[0-9]*\.[0-9]+

此正则表达式表示一个可选的负号,后跟至少一个数字,后跟一个小数点,后跟至少一位数字。

代码

下面是这个 Lex 程序的实现,注意,该程序使用了 C 语言的 stdio.h 库函数,在输出时使用了 printf 函数。

%{
#include <stdio.h>
%}

%option noyywrap

%%

-?[0-9]+          { printf("整数:%s\n", yytext); }
-?[0-9]*\.[0-9]+  { printf("浮点数:%s\n", yytext); }

.                 { /* do nothing */ }

%%

int main() {
    yylex();
    return 0;
}
代码说明

在代码中,我们首先引入了 stdio.h 库,以便在输出结果时使用 printf 函数。然后,我们使用 %option noyywrap 声明不需要使用默认的 yywrap 函数,因为我们只处理一次输入。

%{...%} 部分可以声明一些 C 语言的代码,这些代码会直接放置在生成的 C 代码的头部。

%% 标记之间是 Lex 的规则部分,我们在这里声明了两个正则表达式规则,分别用于识别整数和浮点数。当匹配到这些规则时,程序会输出相应的消息。

在最后的 main 函数内,我们调用了 yylex 函数,开始执行程序。

使用

为了使用这个程序,我们需要安装 Lex 工具和 C 语言编译器。以 Ubuntu 系统为例,可以使用以下命令安装 Lex 和 C 编译器:

sudo apt-get install flex
sudo apt-get install gcc

然后,将上述代码保存为 scanner.l 文件,并使用以下命令编译它:

flex scanner.l
gcc lex.yy.c -lfl -o scanner

此时,编译器会生成一个名为 scanner 的可执行文件,我们可以使用以下命令将输入文本传递给该程序:

echo "1234 -5678 12.34 -56.78" | ./scanner

该命令会输入一行文本并将其传递给 scanner 程序,该程序会识别并输出输入文本中的数字:

整数:1234
整数:-5678
浮点数:12.34
浮点数:-56.78