📅  最后修改于: 2023-12-03 15:17:19.094000             🧑  作者: Mango
Lex程序是一种词法分析器生成器,用于自动生成解析输入文本的代码。本文将介绍如何使用Lex程序来识别和计算正数和负数。
以下是一个示例Lex程序,它可以识别和计算正数和负数。
%{
#include <stdio.h>
int sum = 0;
%}
DIGIT [0-9]
%%
{DIGIT}+ { sum += atoi(yytext); }
\-{DIGIT}+ { sum -= atoi(yytext+1); }
%%
int main(int argc, char **argv)
{
yylex();
printf("%d\n", sum);
return 0;
}
%{...%}
: 用于将C代码插入到生成的解析器代码中。在这个例子中,我们使用C的#include<stdio.h>
来包含标准输入输出库。
DIGIT [0-9]
: 定义一个宏DIGIT
,它将匹配0到9之间的数字。
%%
: 用于分隔程序的节(section),包含三个节:
第一个节:用于定义文本模式和对应的操作(action)。
"{DIGIT}+"
和"\-{DIGIT}+"
是两个文本模式,匹配一个或多个数字(在第一个模式中,数字前面没有负号,在第二个模式中,数字前面有一个负号)。{ sum += atoi(yytext); }
和{ sum -= atoi(yytext+1); }
分别是对应的操作,用于将匹配到的数字转换为整数并加/减到sum
变量中。
第二个节:包含一些Lex程序的选项和快捷定义。在这个例子中,没有使用任何选项和快捷定义。
第三个节:用于声明Lex程序的主函数yylex()
。在这个例子中,我们只需要在main()
函数中调用yylex()
一次,就可以对输入的文本进行解析并计算出结果。
编写完Lex程序之后,我们需要使用Lex工具将它编译成C代码,并使用C编译器将其编译成可执行程序。在Linux系统下,我们可以使用以下命令进行编译和运行:
$ lex my_program.lex # 使用lex编译器将程序编译成C代码
$ gcc lex.yy.c -o my_program # 使用gcc编译器将C代码编译成可执行程序
$ ./my_program # 运行程序
假设我们输入了以下文本:
10
-5
8
-3
程序将输出:
10
这是因为程序计算了所有的数字之和,并将结果打印出来。在这个例子中,10-5+8-3=10
,因此程序的输出是10。