设计一个简单的计算器,支持加减乘除和括号,能够处理整数和浮点数;要求给出可编译的.l和.y文件
时间: 2024-03-18 11:38:56 浏览: 138
以下是一个简单的计算器的.lex文件:
```
%{
#include "y.tab.h"
%}
DIGIT [0-9]
INTEGER {DIGIT}+
FLOAT {DIGIT}+"."{DIGIT}+
WS [ \t\n]
PLUS "+"
MINUS "-"
TIMES "*"
DIVIDE "/"
LPAREN "("
RPAREN ")"
%%
{INTEGER} { yylval = atoi(yytext); return INTEGER; }
{FLOAT} { yylval = atof(yytext); return FLOAT; }
{PLUS} { return PLUS; }
{MINUS} { return MINUS; }
{TIMES} { return TIMES; }
{DIVIDE} { return DIVIDE; }
{LPAREN} { return LPAREN; }
{RPAREN} { return RPAREN; }
{WS} { /* ignore whitespace */ }
%%
```
以下是一个简单的计算器的.y文件:
```
%{
#include <stdio.h>
#include <stdlib.h>
%}
%token INTEGER FLOAT PLUS MINUS TIMES DIVIDE LPAREN RPAREN
%%
input:
/* empty */
| input line
;
line:
expr '\n' { printf("= %f\n", $1); }
;
expr:
INTEGER { $$ = $1; }
| FLOAT { $$ = $1; }
| expr PLUS expr { $$ = $1 + $3; }
| expr MINUS expr { $$ = $1 - $3; }
| expr TIMES expr { $$ = $1 * $3; }
| expr DIVIDE expr { $$ = $1 / $3; }
| LPAREN expr RPAREN { $$ = $2; }
;
%%
int main(void) {
yyparse();
return 0;
}
void yyerror(const char *s) {
fprintf(stderr, "error: %s\n", s);
exit(1);
}
```
在使用 Flex 和 Bison 编译和链接后,就可以得到一个能够进行简单加减乘除和括号运算的计算器。
阅读全文