已知文法,bison代码求文法计算器
时间: 2023-07-10 14:05:14 浏览: 89
由于您没有给出文法的具体定义,我将给出一个基本的文法计算器的Bison代码,您可以根据需要进行修改和扩展。
首先,我们需要定义文法中的终结符和非终结符。假设我们有以下文法规则:
```
expr -> term
expr -> expr + term
term -> factor
term -> term * factor
factor -> NUMBER
factor -> ( expr )
```
其中,`NUMBER`是一个整数常量。那么我们可以将其翻译成以下Bison代码:
```
%{
#include <stdio.h>
%}
%token NUMBER
%left '+' '-'
%left '*' '/'
%%
expr: term
| expr '+' term
| expr '-' term
;
term: factor
| term '*' factor
| term '/' factor
;
factor: NUMBER
| '(' expr ')'
;
%%
int yylex(void) {
int c;
do {
c = getchar();
} while (isspace(c));
if (isdigit(c)) {
int val = c - '0';
while (isdigit(c = getchar())) {
val = val * 10 + c - '0';
}
ungetc(c, stdin);
yylval = val;
return NUMBER;
}
return c;
}
int yyerror(const char *msg) {
fprintf(stderr, "error: %s\n", msg);
return 1;
}
int main(void) {
yyparse();
return 0;
}
```
在Bison代码中,我们使用`%token`指令定义终结符`NUMBER`,并使用`%left`指令定义运算符的优先级和结合性。在规则中,`expr`表示表达式,`term`表示项,`factor`表示因子,这些都是非终结符。规则中使用`|`表示可能的选择,使用`'+'`、`'-'`、`'*'`和`'/'`表示运算符。
在Bison代码中,我们还定义了`yylex()`函数,它从标准输入中读取输入,并返回识别到的终结符类型。在本例中,我们只需要识别整数常量。`yyerror()`函数用于处理语法错误,`main()`函数则调用`yyparse()`函数开始解析输入。
现在,我们可以将以上代码保存为`calc.y`,并使用以下命令编译它:
```
bison -d calc.y
gcc calc.tab.c -o calc
```
然后,我们就可以运行这个文法计算器了:
```
$ ./calc
1+2*3
7
(1+2)*3
9
```
以上是一个基本的文法计算器,您可以根据需要进行修改和扩展。
阅读全文