编写一个yacc描述文件,实现具有加法和乘法功能的计算器。
时间: 2024-02-15 16:03:00 浏览: 57
下面是一个简单的 Yacc 描述文件,它实现了一个具有加法和乘法功能的计算器:
```
%{
#include <stdio.h>
%}
/* 定义终结符号 */
%token NUMBER
%token PLUS
%token TIMES
%%
/* 定义文法规则 */
calc: expr { printf("%d\n", $1); }
;
expr: expr PLUS term { $$ = $1 + $3; }
| term { $$ = $1; }
;
term: term TIMES factor { $$ = $1 * $3; }
| factor { $$ = $1; }
;
factor: NUMBER { $$ = $1; }
| '(' expr ')' { $$ = $2; }
;
%%
#include "lex.yy.c"
int main()
{
yyparse();
return 0;
}
int yyerror(char *s)
{
fprintf(stderr, "%s\n", s);
return 0;
}
```
在这个描述文件中,我们使用 `%token` 声明了三个终结符号:`NUMBER`、`PLUS` 和 `TIMES`。接着,我们定义了四个文法规则,分别是 `calc`、`expr`、`term` 和 `factor`。其中,`calc` 规则表示整个计算器的语法结构,它只包含一个 `expr`。`expr` 规则表示加法表达式,它可以由两个 `expr` 之间的加号和一个 `term` 组成,或者只有一个 `term`。`term` 规则表示乘法表达式,它可以由两个 `term` 之间的乘号和一个 `factor` 组成,或者只有一个 `factor`。`factor` 规则表示数字或者括号中的表达式。
在描述文件的末尾,我们通过 `#include` 命令引入了 Lex 生成的词法分析器,并在 `main` 函数中调用了 `yyparse` 函数来解析输入的表达式。最后,我们还定义了一个 `yyerror` 函数,用于处理语法错误。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)