📜  Lex程序实现一个简单的计算器(1)

📅  最后修改于: 2023-12-03 15:02:40.809000             🧑  作者: Mango

Lex程序实现一个简单的计算器

本文将介绍如何使用Lex程序实现一个简单的计算器。计算器功能包括:

  • 加法(+)
  • 减法(-)
  • 乘法(*)
  • 除法(/)
  • 括号((,))
编写Lex程序

我们需要编写一个Lex程序,来将用户输入的表达式转换为计算器可以理解的语言。这个程序包括两个部分:模式和动作。

模式

模式用于匹配用户输入的字符串。在本计算器中,我们需要识别以下模式:

  • 数字(包括整数和小数)
  • 空格
  • 加减乘除
  • 括号

使用正则表达式定义模式。

%{
#include <stdio.h>
%}

digit   [0-9]
space   [ \t\r\n\f]
number  {digit}+(\.{digit}+)?

%%

{number}    { printf("%s\n", yytext); }
{space}     /* Ignore whitespace */
"+"         { printf("ADD\n"); }
"-"         { printf("SUBTRACT\n"); }
"*"         { printf("MULTIPLY\n"); }
"/"         { printf("DIVIDE\n"); }
"("         { printf("LPAREN\n"); }
")"         { printf("RPAREN\n"); }

%%

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

我们需要为每个模式定义一个动作。在本计算器中,动作将对用户输入的字符串进行处理,将其转换为计算器可以理解的语言。

在上面的Lex程序中,我们使用printf()语句打印每个模式匹配到的字符串,以及对应的动作。

使用Flex编译程序

我们使用Flex编译器将程序编译为可执行文件。在Linux系统上,我们可以执行以下命令:

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

执行上面的命令后,会生成一个可执行文件calculator

运行程序

我们可以直接在命令行中输入表达式,程序会将其转换为计算器可以理解的语言,并输出到控制台中。

$ ./calculator
1 + 2 - 3 * 4 / 5
1
ADD
2
SUBTRACT
3
MULTIPLY
4
DIVIDE
5
总结

使用Lex程序实现一个简单的计算器并不困难。我们只需要定义模式和对应的动作即可。然而,这个计算器还非常简单,我们可以进一步扩展它的功能,例如加入优先级、函数等。