Я пытаюсь сгенерировать лексер и парсер для моей грамматики с помощью 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 в списке, если условие]