2012-01-21 48 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評價是假的,它沒有進一步分析任何。

+0

這看起來很錯誤:'return'將從'yyparse'返回,你永遠不應該這樣做,或者使用'YYABORT' /'YYACCEPT'。 – akim