2017-06-05 70 views
1

我正在嘗試修改一個PDDL解析器,並且存在一個可選的標記。假設這些是我想要閱讀的2個選項。 (圖1)JavaCC:如何解析可能不存在的字符?

(node1) 
(node1 :isGood)    // :isGood is optional to be exist 

爲了支持這兩種情況下,我喜歡在低於這個figure2的.jj開發的代碼。它工作正常;然而,這是一種不恰當的書寫方式。 (圖2)

<LEFT_BRACKET> 
<NODE> 
(LOOKAHEAD(2) <IS_GOOD> <RIGHT_BRACKET> | <RIGHT_BRACKET>) 

中的.jj其實我是希望它應該像在低於這個figure3的代碼。從圖3中,它成功地解析了.jj,但它無法解析我從中收到的圖1中的腳本,而不是我所收到的unexpected token ")"。 (figure3)

<LEFT_BRACKET> 
<NODE> 
(LOOKAHEAD(2) <IS_GOOD>)  // this is where it should support an optional token 
<RIGHT_BRACKET> 

問題:如何寫的.jj代碼以支持如圖一兩個條件?換句話說,如何使它支持可能不存在的可選標記:isGood以及適當的編程方法。

我可能不知道LOOKAHEAD是如何工作的。閱讀figure1的任何解決方案都很感謝。

+2

是不是隻是'()?'? – lexicore

+0

這在這種情況下不起作用。但是,我現在只是通過將括號改爲方括號來得到我的答案。該部分將看起來像這樣>>'[LOOKAHEAD(2)]'。此代碼指出「如果有然後訪問它,否則跳過它。我感謝您的幫助,我將離開這個問題給其他人。無論如何,我仍然不確定LOOKAHEAD如何工作。 – Mes

+1

你不用在這種情況下,不需要預見性規範,只需使用'... [] '或'...()?'。 –

回答

2

在這種情況下,您不需要預見規範。只需使用

<LEFT_BRACKET> 
<NODE> 
[ <IS_GOOD> ] 
<RIGHT_BRACKET> 

<LEFT_BRACKET> 
<NODE> 
(<IS_GOOD>)? 
<RIGHT_BRACKET> 

<LEFT_BRACKET> 
<NODE> 
(<IS_GOOD> | {}) 
<RIGHT_BRACKET> 

它們的意思是一樣的。

+0

然而,這些都很難找到,我嘗試了很多解決方案來學習LOOKAHEAD ...仍然不能確定它的詳情。 LOOKAHEAD會影響我的例子嗎? – Mes

+0

我認爲如果你添加一個'LOOKAHEAD(2)'規範,這意味着解析器應該使用最多2個標記的向前看,因爲這個例子只需要1個標記,在這種情況下添加'LOOKAHEAD(2)'的帽子將沒有任何區別。爲什麼不嘗試一個實驗。使用或不使用lookahead規範生成代碼,並比較生成的java代碼。我的猜測是這兩種情況都是一樣的。 –

+1

至於「很難找到」,前兩個是在「語法文件」文檔中。最後一個是FAQ。 –