2013-06-07 1 views
1

У меня есть ошибка (как сказано в заголовке) с одним правилом, которое я не знаю, как решить.правило имеет не-LL (*) решение из-за рекурсивных вызовов правил

я написал следующее правило:

FunctionArguments returns FunctionArgs::IFunctionArguments : 
    FunctionArgumentsNormal 
    | FunctionArgumentsForIter 
    ; 

FunctionArgumentsNormal returns FunctionArgs::IFunctionArguments : 
    {FunctionArgs::FunctionArguments} args+=Expression (',' args+=Expression)* 
    | {FunctionArgs::FunctionArguments} argNames+=NamedArguments (',' argNames+=NamedArguments)* 
    ; 

FunctionArgumentsForIter returns FunctionArgs::IFunctionArguments : 
    {FunctionArgs::FunctionArgumentsIterator} exp=Expression 'for' iterators=ForIterator 
    ; 

Не могли бы вы помочь мне разрешить его левым факторинга это выражение или давать любые другие решения, пожалуйста?

+1

Укажите, хотите ли вы использовать грамматику Xtext или грамматику ANTLR. Они совершенно разные, и это влияет на то, как рекурсия может быть решена. –

+0

Я использую грамматику Xtext –

ответ

0

В грамматике LL у вас не может быть левой рекурсии. Проблема заключается в том, что парсер LL может выбрать сделать такой вывод: FunctionArguments -> FunctionArgumentsNormal -> FunctionArguments -> FunctionArgumentsNormal ... В вашей грамматике содержится так называемая косвенная левая рекурсия. Вы можете найти пример в этой статье в Википедии, в которой также содержится решение о том, как вы можете это исправить: Left-Recursion. Хорошее место для начала - (я полагаю, вы уже это сделали), написав свою грамматику очень простым способом без всех аннотаций и вещей, включенных в ваш пример. Если у вас есть грамматика в простой форме:

S -> A | B 
B -> "terminal1" B 
    | b 
A -> a "terminal2" 

гораздо проще выполнить необходимую переписку.

+0

Я думаю, что это поможет мне. я попробую позже .. Между тем, thx –

+0

Я знаю, это было какое-то время. Тем не менее я не уверен, я понимаю, как грамматика, данная ОП, может генерировать вышеупомянутый цикл. По крайней мере, не из данного фрагмента грамматики. Где происходит вывод из функции FunctionalArgumentsNormal -> FunctionArguments? – Johnson

+0

Вывод 'FunctionalArgumentsNormal -> FunctionArguments' происходит при применении 2-го правила (любой из сторон или знака' | '): ' {FunctionArgs :: FunctionArguments} args + = выражение (',' args + = выражение) * ' –

 Смежные вопросы

  • Нет связанных вопросов^_^