删除语法中的左递归

时间:2015-07-10 09:36:37

标签: grammar javacc left-recursion

我有这个语法:

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

优先顺序是:

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

我需要删除关于优先级的左递归(并在JavaCC中全部写入)。

你能帮我删除递归吗?

2 个答案:

答案 0 :(得分: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" | "@"

但我不知道这个解决方案是否正确。

非常感谢。

此致 多梅尼科

答案 1 :(得分: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来电中遇到一些冲突,以及&#34;二进制&#34;表达式,例如agent + agent

在任何情况下,你的语法看起来与算术表达式非常相似,所以我建议你看一下这些通常是如何在JavaCC中处理的。