Bison是一种流行的工具,可用于生成语法解析器。Bison在其文法中使用语义动作来计算表达式的值。这些值语义动作可以使用$$符号指定,并且它们可以返回任何类型的值。
以下是一个使用Bison解析器来计算表达式的示例程序:
%{
#include
%}
%union{
int i;
double d;
}
%token INTEGER
%token FLOAT
%token PLUS MINUS TIMES DIVIDE LPAREN RPAREN
%type expr
%type term factor
%%
expr: expr PLUS term { $$ = $1 + $3; }
| expr MINUS term { $$ = $1 - $3; }
| term
;
term: term TIMES factor { $$ = $1 * $3; }
| term DIVIDE factor { $$ = $1 / $3; }
| factor
;
factor: LPAREN expr RPAREN { $$ = $2; }
| PLUS factor { $$ = $2; }
| MINUS factor { $$ = -$2; }
| INTEGER { $$ = $1; }
| FLOAT { $$ = $1; }
;
%%
int main()
{
yyparse();
return 0;
}
int yyerror(char *msg)
{
printf("Error: %s\n", msg);
return 0;
}
int yylex()
{
// ...
}
在上面的示例代码中,我们可以看到%union
和%token
部分,它们定义了我们使用的不同类型的词法单元。%type
标记定义了每个非终结符的类型。在规则的右侧,我们有一些语义值动作,用于计算表达式的值。当Bison遇到规则右侧的语义动作时,它将执行该代码并将其计算结果存储在$$变量中,这些变量将被传递给更高一级的规则或返回给调用代码。
使用Bison解析语法值是相对容易的,只需使用语义动作并在动作中计算表达式即可。
上一篇:Bison解析时感到困惑