0

私はこの文法を持っています:

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

優先順位は次のとおりです。

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

優先度を考慮して左再帰を削除する必要があります(そしてすべてJavaCCに書き込みます)。

再帰を削除するのを手伝ってもらえますか?

4

2 に答える 2

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" | "@"

しかし、この解決策が正しいかどうかはわかりません。

どうもありがとうございました。

よろしくドメニコ

于 2015-07-10T15:54:08.163 に答える
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 で通常どのように処理されるかを確認することをお勧めします。

于 2015-07-10T13:17:58.330 に答える