我想用Flex和Bison做一个项目。我有一个语法(这只是我的一部分):
variable_name: | text {printf("VARIABLE NAME (TEXT) IN BISON: %s\n", $1); $$ = _variable_init($1);} | character {printf("VARIABLE NAME (CHARACTER) IN BISON: %s\n", $1); $$ = _variable_init($1);} ; bool_expr: | true_t { printf("BOOL EXP TRUE\n"); $$ = _bool_expression_init_bool(TRUE); } | false_t { printf("BOOL EXP FALSE\n"); $$ = _bool_expression_init_bool(FALSE); } | variable_name { printf("BOOL EXP VARIABLE: %s\n", $1->name); $$ = _bool_expression_init_variable($1); } | bool_expr eq bool_expr { printf("BOOL EXP ==\n"); $$ = _bool_expression_init_binary_op($1, "==", $3); } | bool_expr noteq bool_expr { printf("BOOL EXP !=\n"); $$ = _bool_expression_init_binary_op($1, "!=", $3); } | bool_expr and bool_expr { printf("BOOL EXP AND\n"); $$ = _bool_expression_init_binary_op($1, "&&", $3); } | bool_expr or bool_expr { printf("BOOL EXP OR\n"); $$ = _bool_expression_init_binary_op($1, "||", $3); } | '!' bool_expr { printf("BOOL EXP NOT\n"); $$ = _bool_expression_init_unary_op("!", $2); } | '(' bool_expr ')' { printf("BOOL EXP ()\n"); $$ = _bool_expression_init_with_brackets($2); } | int_expr eq int_expr { printf("BOOL EXP INT==\n"); $$ = _bool_expression_init_from_int($1, "==", $3); } | int_expr noteq int_expr { printf("BOOL EXP INT!=\n"); $$ = _bool_expression_init_from_int($1, "!=", $3); } | int_expr get int_expr { printf("BOOL EXP INT>=\n"); $$ = _bool_expression_init_from_int($1, ">=", $3); } | int_expr let int_expr { printf("BOOL EXP INT<=\n"); $$ = _bool_expression_init_from_int($1, "<=", $3); } | int_expr '<' int_expr { printf("BOOL EXP INT<\n"); $$ = _bool_expression_init_from_int($1, "<", $3); } | int_expr '>' int_expr { printf("BOOL EXP INT>\n"); $$ = _bool_expression_init_from_int($1, ">", $3); } ; int_expr: | num { printf("INT EXP NUM\n"); $$ = _int_expression_init_int($1); } | variable_name { printf("INT EXP VARIABLE\n"); _int_expression_init_variable($1); } | int_expr '+' int_expr { printf("INT EXP +\n"); $$ = _int_expression_init_binary_op($1, "+", $3); } | int_expr '-' int_expr { printf("INT EXP -\n"); $$ = _int_expression_init_binary_op($1, "-", $3); } | int_expr '*' int_expr { printf("INT EXP *\n"); $$ = _int_expression_init_binary_op($1, "*", $3); } | int_expr '/' int_expr { printf("INT EXP /\n"); $$ = _int_expression_init_binary_op($1, "/", $3); } | '(' int_expr ')' { printf("INT EXP ())\n"); $$ = _int_expression_init_bracket($2); } ;
我只复制了重要的部分(希望有问题)
var != 10
作为bool_expr,Bison将var标识为变量并打印:
VARIABLE NAME (TEXT) IN BISON: var
但在下一刻它就会打印出来
BOOL EXP VARIABLE: var !=
当有规则时,它认为变量是“var!=”
int_expr != int_expr
但它没有检查这一部分。Btw变量具有variable*类型(结构),int_expr具有IntExpression*(结构)。bool_expr具有BoolExpression*结构。我不知道该怎么做。我尝试了一下,当我向bool_exprr写入6个与前6个规则几乎相同的附加规则时,它奏效了。我将第一个int_expr替换为变量,但这很恶心。正如我所知,Bison搜索的是最长的比赛,而不是第一场比赛
VARIABLE NAME (TEXT) IN BISON: var VARIABLE NAME IN FUNCTION: var //It was called in variable_init function BOOL EXP VARIABLE: var!= INT EXP NUM //10