if_stmt: tok_if '(' condition ')' '{' root '}' {debugBison(26);}
;
condition : expression {debugBison(19); if ($1==0.0){exit(0);}}
;
我正在尝试在野牛中实现 if 条件,当条件为 false 时一切正常,它退出整个执行并且在此之后不执行任何行,我想做的是我只想跳过这一行(其中条件为 false 或 0.0),其他行应该可以正常工作
以前我也做过同样的事情
if_stmt:
tok_if '(' expression ')''{' root '}' {
debugBison(17);
if ($3!= 0.0) {
yyerror("Hello");
} else {
yyerror("Not Hello");
}
}
;
这也不是真的,我什至尝试这样 如果_stmt: tok_if '('条件')' true_block | tok_if '('条件')' false_block ;
true_block:
'{' root '}' { debugBison(17); } // Executes root if condition is true
;
false_block:
/* empty */ { debugBison(18); } // Skips the block if condition is false
;
condition:
expression { $$ = ($1 != 0.0); } // Condition returns 1 if true, 0 if false.
;
上述两种方法的问题在于它首先执行语法,然后检查 {} 中的条件。所以任何人都可以帮助我第一种方法??
your text
在 Bison 中实现
if
语句时,您希望在条件为 false 时跳过执行某些行,而不退出整个程序。目前,您正在使用 exit(0)
;当条件为假时,终止整个执行。
要解决此问题,您可以根据条件的值对语法进行分支。这意味着调整您的语法规则,以便如果条件为真,则处理代码块,如果条件为假,则跳过它。
具体操作方法如下:
if_stmt:
tok_if '(' condition ')' true_block
;
true_block:
'{' root '}'
|
;
condition:
expression { $$ = ($1 != 0.0); }
;
然后,在
true_block
内,可以根据条件控制是否解析root
:
true_block:
{
if ($3) {
yyparse();
}
else {
/* Do nothing or log if necessary */
}
}
'{' root '}'
;
但是,不建议在操作中直接控制解析流程。更简洁的方法是像这样编写语法:
if_stmt:
tok_if '(' condition ')' '{' root '}' { if (! $3) $$ = 0; }
|
tok_if '(' condition ')' '{' '}' { }
;
在此方法中,如果条件为真,则处理
{ root }
块;如果为 false,则处理 { }
空块,并跳过 root
。这样,您就可以防止执行不需要的代码。