在Bison中,可以使用debug
宏启用调试输出。使用%debug
指令可以打印出Bison在语法规则匹配时所使用的规则。默认情况下,Bison将按照规则的顺序将它们打印到调试输出中。但是,有时候我们需要按照规则出现的先后顺序将它们打印出来,这时我们可以使用%printer
指令。
在下面的示例中,我们建立了一个简单的算术表达式语法,包括加、减、乘、除、括号和常量。我们还定义了一个结构体expr_t
来存储表达式的值和类型信息。这样我们在打印语法规则时,可以按照它们的先后顺序打印出来。
%{
#include
#include
#include
typedef struct expr_s {
double value;
char* type;
} expr_t;
%}
%define api.pure full
%code {
int yylex(void);
void yyerror(char*);
void print_expr(expr_t*);
}
%token T_CONSTANT
%token T_PLUS T_MINUS T_TIMES T_DIVIDE T_LPAREN T_RPAREN
%type expression term factor primary
%printer expr_t* {
switch ($$->type) {
case "number":
printf("%g", $$->value);
break;
case "addition":
printf("(");
print_expr($$->value_ptr);
printf(" + ");
print_expr($$->value_ptr + 1);
printf(")");
break;
case "subtraction":
printf("(");
print_expr($$->value_ptr);
printf(" - ");
print_expr($$->value_ptr + 1);
printf(")");
break;
case "multiplication":
printf("(");
print_expr($$->value_ptr);
printf(" * ");
print_expr($$->value_ptr + 1);
printf(")");
break;
case "division":
printf("(");
print_expr($$->value_ptr);
printf(" / ");
print_expr($$->value_ptr + 1);
printf(")");
break;
default:
printf("unknown expression type\n");
break;
}
}
%%
expression : term
| expression T_PLUS term { $$ = malloc(sizeof(expr_t)); $$->value
上一篇:Bison打印导致错误的字符