使用以下文法构建小型计算器,使之支持+,-,*,/的运算,其中num为正整数 E -> E+E | E-E| E*E | E/E | num;输出产生式:输出计算答案要求使用lex
时间: 2024-01-22 07:17:46 浏览: 69
计算器(支持+,-,*,/)运算
以下是针对该小型计算器的简单的词法分析器Lex代码:
```
%{
#include <stdio.h>
#include <stdlib.h>
%}
%%
[0-9]+ { printf("num\n"); }
[+\-*/] { printf("%c\n", yytext[0]); }
[ \t\n] ; /* skip whitespace */
. { fprintf(stderr, "Error: Invalid character %s\n", yytext); exit(1); }
%%
int main(int argc, char **argv) {
yylex();
return 0;
}
```
接下来是符合文法的语法分析器(使用flex和bison):
lexer.l:
```
%{
#include "parser.tab.h"
%}
%%
[0-9]+ { yylval.num = atoi(yytext); return NUM; }
[+\-*/] { return yytext[0]; }
[ \t\n] ; /* skip whitespace */
. { fprintf(stderr, "Error: Invalid character %s\n", yytext); exit(1); }
%%
parser.y:
%{
#include <stdio.h>
%}
%token NUM
%%
expr: expr '+' term { $$ = $1 + $3; }
| expr '-' term { $$ = $1 - $3; }
| term { $$ = $1; }
;
term: term '*' factor { $$ = $1 * $3; }
| term '/' factor { $$ = $1 / $3; }
| factor { $$ = $1; }
;
factor: NUM { $$ = $1; }
| '(' expr ')' { $$ = $2; }
;
%%
int main(int argc, char **argv) {
yyparse();
return 0;
}
由于此计算器只支持正整数,因此在计算结果时,使用了整数除法运算符/。如果需要支持浮点数,可以使用浮点数除法运算符/。
阅读全文