2013-02-27 75 views
2

說我有這樣的語法(目標語言爲C):檢查可選規則爲空或不

mycmd : cmd_name option? arg1 

因爲「選項」是可選的,如果我直接這樣訪問它 -

mycmd : cmd_name option? arg1 
{ add_option($option.text); } 

該程序會崩潰,所產生的C語言代碼是

add_option(option->getText(option)); 

這裏的 「選項」 是NULL。

我嘗試以下

mycmd : cmd_name option? arg1 
{ if ($option != NULL) { add_option($option.text);} } 

這工作得很好。

但我搜索了一下,發現推薦的方法是預先聲明一些布爾,在子規則中將其設置爲true並檢查其值。我不喜歡它,因爲它使語法更難閱讀。

問題是,檢查$ option對NULL是否適合我?還有其他建議的方法,以便我可以將語法和動作分開嗎?

我正在使用ANTLR3.4。

回答

1

檢查對NULL是合適的,或者你可以代替把行動的可選子規則內。

mycmd : cmd_name 
     (option {add_option($option.text);})? 
     arg1 
+0

我檢查生成Parser.c,我相信原來的代碼是不正確的 - – 2013-03-03 21:35:19

+0

我檢查生成Parser.c,我相信把可選的子規則內的動作是正確的解決方案,「選項」成爲Parser.c中的一個函數,對NULL進行檢查是沒有意義的。 – 2013-03-03 21:43:14

2

我會用以下內容:

{ if ($option) { add_option($option.text); } }