2012-01-21 6 views
2

単純なパーサを作成しようとしています。例については "if"条件が失敗した場合、構文解析をスキップします。

cond: T_IF '(' exp ')' '#' stmt_block opt_elseifs opt_else end {if($3 == 0) return;} 

opt_elseifs : /* Nothing */               
      | opt_elseifs T_ELSIF '(' exp ')' '#' stmt_block '#'     
; 
opt_else : /* Nothing */ 
     | T_ELSE '#' stmt_block '#' 
; 
end : '#' 
; 

a = 0; 
if(a) # 
c = 10 + 20; 
# 

私が印刷されたCの値を望んでいないが、これは、cの値を印刷しています。 ここで何が間違っていますか?

+0

あなたの 'cond'ルールに' end'の代わりに ''# ''を入れないのはなぜですか? –

+0

Basileさんにありがとうございます。しかし、私はそれが本当の問題ではないと思います。 – WordsWorth

+0

私はその質問を理解していません。 'c'はどのように印刷されますか?あなたのレクサーは何ですか?誰が 'c'を印刷していますか? –

答えて

0

バイソンマニュアルを読んだ後に見つかった解決策です。私はここでもそれを共有することをお勧めします。 は、私はそう

cond: T_IF '(' exp ')'  { if($3 == 0) return; } 
     '#' stmt_block opt_elseifs opt_else end  
; 

をやるべきEXPがfalseであると評価されている場合、それはそれ以上解析しません。

+0

これは非常に間違っているようです。 'return'は' yyparse'から戻ってくるので、決して行うべきではないか、 'YYABORT' /' YYACCEPT'を使うべきです。 – akim

関連する問題