2013-12-23 4 views
0

У меня есть ниже грамматику для разбора выражений, как эти,Grammar помощь [Antlr не LL (*)]

-> a 
-> (a) 
-> (a | b | c) 
-> (a (b | (c | d))) 
-> (a (
    b (
     c x 
     | d (e | f) 
    ) 
    ) 
) 

.

term: WORD term? 
    | '(' term ('|' term)* ')' 
    ; 


WORD : ('a'..'z')+ 
    ; 

Теперь я попытался сделать небольшую модификацию первого заявления в срок правления к от WORD term? к WORD term* но ANTLR жалуется говоря о своем несогласии LL (*), любая идея, как это можно решить, не прибегая к глобальным возвраты.

ответ

0

Я смог изменить свою грамматику и в итоге оказался таким, который, кажется, работает для всех моих случаев.

term: (word | options_list)+ 
    ; 

word: WORD 
    ; 

options_list: '(' term ('|' term)* ') 
    ; 

WORD: ('a'..'z' | 'A'..''Z' | '_' | '0'..'9')+ 
    ; 
0

Следующие работы для меня с ANTLR 4,1:

term: WORD term* | '(' term ('|' term)* ')'; 
WORD: ('a'..'z')+; 

Какую версию ANTLR вы используете?

+0

Я использую 3.x, я думаю, что Antlr 4 обрабатывает не-LL (*) и левую рекурсию имплицитно. –

0

Может быть проблема с версией, как уже предполагал Стивен. LL (*) синтаксический анализатор и конечный автомат существуют, так как версия 3 ANTLR все до этого только LL (k)

Но почему вы хотите заменить термин? с термином *, так как вы получили термин * implicietely с термином? с определением предыдущего правила, поскольку он уже рекурсивный.

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

Я думаю, что здесь причина выхода ошибки ANTLR. Я не могу проверить это прямо сейчас, но я уверен.

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