Правило ошибки ANTLR3 имеет не-LL (*) решение из-за рекурсивных вызовов правил - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь сгенерировать лексер и парсер для моей грамматики с помощью antlr 3. Может кто-нибудь объяснить, что означает эта ошибка?

error(211): T.g:14:6: [fatal] rule stmt has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2.  Resolve by left-factoring or using syntactic predicates or using backtrack=true option.

Вот моя грамматика


grammar T;

prog :
     (stmt)+
     ; 

stmt :
    assigning 
    | concatenation 
    | addorremove 
    | slicing
    ;

assigning : ID '=' value
    | ID '[' INT ']' '=' value 
    ;
addorremove : ID '.' 'append' '(' value ')' 
    | ID '.' 'insert' '(' INT ',' value ')' 
    | ID '.' 'remove' '(' value ')' 
    ;
concatenation :
     ID '=' val1=value '+' val2=value
     ;

slicing : id1=ID '=' id2=ID '[' int1=INT ':' int2=INT ']' 
    | id1=ID '=' id2=ID '[' int1=INT ':' ']' 
    | id1=ID '=' id2=ID '[' ':' int2=INT ']' 
    ;

list :
    '[' (val1=value (',' val2=value )*)? ']'
    | '[' expr 'for' 'x' 'in' id2=ID 'if' op1=operand COMP op2=operand ']'
    ;

operand :
    INT 
    | 'len' '(' 'x' ')'  
    | 'abs' '(' 'x' ')' 
    ;
expr :
     'x' 
     | 'len' '(' 'x' ')' 
     | 'abs' '(' 'x' ')' 
     | 'max' '(' 'x' ')' 
     ;

value :
    INT 
    | list  
    | STRING  
    | ID
    ;

//lexer rules
STRING : '\'' (~'\'')* '\'';
INT : ('-')? ('0'..'9')+;
ID : ('a'..'z'|'A'..'Z'|'\_') ('a'..'z'|'A'..'Z'|'0'..'9'|'\_')*;
COMP : ('==' | '!=' | '<' | '<=' | '>' | '>=');

// consume whitespace
WS  :   (' '|'\t'|'\n'|'\r')+ {skip();} ;

// consume comments
COMMENTS  :   ('//')~('\n'|'\r')* {skip();} ;

Эта грамматика предназначена для воссоздания упрощенной версии python для манипуляций со списками, которые включают в себя присваивания, конкатенацию, добавление и удаление элементов, а также нарезку списков.

Существует также часть понимания для разрешения выражений списка вформа: [выражение для x в списке, если условие]

1 Ответ

0 голосов
/ 14 мая 2019

Запуск грамматики с помощью jar antlr 4 устранил проблему.

...