我正在尝试使用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]
答案 0 :(得分:0)
使用antlr 4 jar运行语法解决了该问题。