如何在Bison中结束if语句?

问题描述 投票:0回答:1
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

c++ compiler-construction bison flex-lexer bisonc++
1个回答
0
投票

在 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
。这样,您就可以防止执行不需要的代码。

© www.soinside.com 2019 - 2024. All rights reserved.