📅  最后修改于: 2023-12-03 14:54:42.887000             🧑  作者: Mango
Lex 是一种词法分析器生成工具,它可以生成 C 语言代码,将输入的文本分解成一个个 token,用于后续语法分析。本程序是一个使用 Lex 工具编写的程序,可以接受有效的整数和浮点数并将它们识别出来。
为了识别输入中的数字,我们需要先了解数字的一些规则。这里以整数为例,整数主要有以下两个规则:
那么,可以使用正则表达式来描述这个规则,比如:
-?[0-9]+
此正则表达式表示一个可选的负号,后跟一到多个数字。
而浮点数规则更加复杂一些,浮点数主要有以下两个规则:
我们可以结合整数规则来得到浮点数的正则表达式,如下:
-?[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