2015-07-10 81 views
0

我有這樣的語法:刪除左遞歸語法中的

agent 
= nil 
| @ 
| id 
| act . agent 
| agent + agent 
| agent "|" agent 
| agent \ restriction 
| agent [relabeling] 
| agent where agent_frame end 
| automation 
| (agent) 

,其中重點是:

"where" < "+" < "|" < "\" < "." < "[" < "nil", "@" 

我需要刪除左遞歸尊重優先級(寫所有的JavaCC) 。

你能幫我刪除遞歸嗎?

+0

你的語法很難看。難道你不能只縮進4個空格的語法來源,並將其替換爲你的問題?謝謝。 – Seki

回答

2

Dinesh謝謝你的回答, 你的解決方案在JavaCC中給我一個衝突(agent-postfix)*。 我解決了這種方式:

agent=agent2 agent' 
agent'= "where" agent_frame "end" agent' | epsilon 

agent2= agent3 agent2' 
agent2'= "+" agent3 agent2' | epsilon 

agent3= agent4 agent3' 
agent3'= "|" agent4 agent3' | epsilon 

agent4 = agent5 agent4' 
agent4'= "\" restriction agent4' | epsilon 

agent5: act "." agent | agent6 

agent6 = agent7 agent6' 
agent6'= "[" relabeling "]" agent6' | epsilon 

agent7= id | automaton | "(" agent ")" | "nil" | "@" 

,但我不知道,如果這個解決方案是正確的。

非常感謝。

Registers Domenico

+0

這是正確的,因爲你已經消除了左遞歸併保持語言相同。但是,語法仍然不明確。例如,有兩個從'agent3'到'act的最左邊派生。 id | id'。我還沒有嘗試過,但我期望JavaCC會給這個語法提出警告。我認爲解決它的最好方法是將'agent5'的規則更改爲'agent5 = act。 agent5'。這消除了'a3 => * a4 => * a5 => * act的最左邊的派生。 a => *行爲。 id | id「,但留下了一個'a3 => * a4 | a4 => * act.id | id'。 –

+0

Hi Theodore Norvell,謝謝你的回答,我用JavaCC中的LOOKAHEAD 2解決了agent5的問題。所以我有「agent5 = lookahead(2)行爲。代理| agent6「。對你的這種改變是否正確?非常感謝。關注Domenico – Domenico

+0

我不知道」act「是什麼。它是非終結符嗎?act => * id'?如果對這兩個問題的答案問題是「是」,那麼'act。agent'和'agent6'之間會有選擇衝突,而且你的'LOOKAHEAD(2)'看起來像是解決這個選擇衝突的正確方法(我可能會寫'LOOKAHEAD (act。)'。 –

0

我不是專家的JavaCC,但這裏是你如何開始擺脫你的左遞歸的:

agent-primary 
= nil 
| @ 
| id 
| act . agent 
| automation 
| (agent) 

agent-postfix 
= + agent 
| "|" agent 
| \ restriction 
| [relabeling] 
| where agent_frame end 

agent 
= agent-primary (agent-postfix)* 

你可能會面臨agent在「二進制呼叫,以及正確的一些衝突「的表述,如agent + agent

無論如何,您的語法看起來與算術表達式非常相似,所以我建議您看看這些通常在JavaCC中如何處理。