删除语法中的左递归
delete left recursion in a grammar
我有这个语法:
agent
= nil
| @
| id
| act . agent
| agent + agent
| agent "|" agent
| agent \ restriction
| agent [relabeling]
| agent where agent_frame end
| automation
| (agent)
优先级是:
"where" < "+" < "|" < "\" < "." < "[" < "nil", "@"
我需要删除关于优先级的左递归(并全部用 JavaCC 编写)。
你能帮我删除递归吗?
我不是 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
.
等 "binary" 表达式中遇到与正确 agent
调用的一些冲突
无论如何,您的语法看起来与算术表达式非常相似,所以我建议您看看这些在 JavaCC 中通常是如何处理的。
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" | "@"
但是不知道这个解对不对
非常感谢。
问候
多梅尼科
我有这个语法:
agent
= nil
| @
| id
| act . agent
| agent + agent
| agent "|" agent
| agent \ restriction
| agent [relabeling]
| agent where agent_frame end
| automation
| (agent)
优先级是:
"where" < "+" < "|" < "\" < "." < "[" < "nil", "@"
我需要删除关于优先级的左递归(并全部用 JavaCC 编写)。
你能帮我删除递归吗?
我不是 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 中通常是如何处理的。
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" | "@"
但是不知道这个解对不对
非常感谢。
问候 多梅尼科