Удалить левую рекурсию в грамматике

У меня есть эта грамматика:

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

где приоритеты:

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

Мне нужно удалить левую рекурсию с учетом приоритетов (и написать все на JavaCC).

Можете ли вы помочь мне удалить рекурсию?

2 ответа

Решение

Динеш, спасибо за ответ, ваше решение вызывает конфликт в 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" | "@"

но я не знаю, правильно ли это решение.

Большое спасибо.

С уважением Доменико

Я не эксперт по 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.

Другие вопросы по тегам