使用lex和yacc制作一个算术计算器,如果算法错误就会报错
时间: 2024-03-07 15:49:35 浏览: 73
lexyacc-calculator:使用 lex 和 yacc 的科学计算器
5星 · 资源好评率100%
好的,以下是使用lex和yacc制作一个算术计算器,并在算法错误时报错的操作步骤:
1. 安装flex和bison(yacc的替代品)。
2. 创建一个名为“calculator.l”的文件,这是lex文件。
3. 在“calculator.l”中定义要识别的词法单元。例如,下面的代码定义了加号和减号:
```
"+" return PLUS;
"-" return MINUS;
```
4. 定义数字的识别方式:
```
[0-9]+(\.[0-9]+)? return NUMBER;
```
这条语句表示匹配一个或多个数字,后面可能跟一个小数点和一个或多个数字。如果匹配成功,返回“NUMBER”词法单元。
5. 定义其他识别方式,如左右括号:
```
"(" return LPAREN;
")" return RPAREN;
```
6. 在文件的末尾添加以下代码以处理不需要识别的字符:
```
. return yytext[0];
```
7. 保存“calculator.l”文件并编译它:
```
flex calculator.l
```
这将生成一个名为“lex.yy.c”的文件。
8. 创建一个名为“calculator.y”的文件,这是yacc文件。
9. 在“calculator.y”文件中定义语法规则。例如,下面的代码定义了加法和减法:
```
expr : expr PLUS term
| expr MINUS term
| term
;
term : term TIMES factor
| term DIVIDE factor
| factor
;
factor : NUMBER
| LPAREN expr RPAREN
;
```
这些规则描述了算术表达式的结构。例如,“expr”规则表示表达式可以由“expr PLUS term”、“expr MINUS term”或“term”组成。
10. 添加代码以处理错误情况:
```
error : /* empty */
| error yyerror("Syntax error");
;
```
这些代码表示如果解析时出现错误,将调用“yyerror”函数。
11. 在“calculator.y”文件的顶部添加以下声明:
```
extern int yylineno;
void yyerror(char *s);
```
这些声明将“yylineno”变量和“yyerror”函数引入到文件中。
12. 在“calculator.y”文件的末尾添加以下代码:
```
void yyerror(char *s) {
fprintf(stderr, "error: %s at line %d\n", s, yylineno);
}
```
这些代码定义了“yyerror”函数,它将错误消息和发生错误的行号打印到标准错误输出。
13. 保存“calculator.y”文件并编译它:
```
bison -d calculator.y
```
这将生成一个名为“calculator.tab.c”的文件。
14. 编译并链接“lex.yy.c”和“calculator.tab.c”:
```
cc lex.yy.c calculator.tab.c -o calculator
```
15. 运行生成的可执行文件:
```
./calculator
```
这将启动计算器并等待用户输入表达式。例如,输入“2 + 3”,然后按回车键,计算器将输出“5”。
如果输入的表达式存在语法错误,例如“2 +”,则计算器将输出以下错误消息:
```
error: syntax error at line x
```
其中“x”是发生错误的行号。
希望这些步骤对您有所帮助!
阅读全文