Antlr и леворекурсивные правила

Я пытаюсь написать грамматику с помощью ANTLR, но не могу понять, как antlr работает с рекурсивным выбором.

Я читаю много статей и форумов, но не могу решить свою проблему ...

Вот небольшая часть моей грамматики:

grammar MyGrammar;

ComponentRef :
    IDENT ('[' Expression (',' Expression)* ']')?
;

Expression:
    ComponentRef ('(' FunctionArguments ')')?
;

FunctionArguments:
    Expression (',' Expression)*
;

IDENT: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;

До сих пор не понимаю, почему не работает ... тут нет двусмысленности! Не так ли?

Вот несколько примеров кода, с которым должна работать моя грамматика:

a
a[b,c]
a[b[c], d]
func(a)
func(a,b,c)
func[a](b,c)
func(a[b], c[d])
func[a](b[c])

Заранее спасибо!


person Luc    schedule 12.06.2012    source источник


Ответы (2)


Во-первых, обязательно ознакомьтесь с правилами лексера и парсера. Также прочтите ANTLR Mega Tutorial.

В коде используются только правила лексера, которые не работают. Хотя даже правила лексера могут быть рекурсивными (в грамматиках ANTLR), их лучше избегать. Скорее, большинство правил должны быть правилами парсера:

componentRef :
    IDENT ('[' expression (',' expression)* ']')?
;

expression:
    componentRef ('(' functionArguments ')')?
;

functionArguments:
   expression (',' expression)*
;

IDENT: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;

Приведенная выше грамматика не распознает введенные вами данные, но ошибок больше нет. Грамматика, распознающая введенные вами данные, может выглядеть так (непроверенная!) Грамматика:

parse
 : expr* EOF
 ;

expr
 : IDENT (index | call)*
 ;

index
 : '[' expr_list ']'
 ;

call
 : '(' expr_list ')'
 ;

expr_list
 : expr (',' expr)*
 ;

IDENT
 : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
 ;

SPACE
 : (' ' | '\t' | '\r' | '\n')+ {skip();}
 ;
person Bart Kiers    schedule 12.06.2012

Я предполагаю, что ваши выражения Capitol - это ошибка. Вероятно, вы хотели ввести строчные буквы.

Как можно сказать, что нет двусмысленности? выражения вызывают functionArguments, functionArguments вызывают выражения. -1

person john ktejik    schedule 14.02.2018