由于递归规则调用,ANTLR3错误规则具有非LL(*)决策

时间:2019-05-14 09:12:23

标签: java python antlr

我正在尝试使用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 :(得分:0)

使用antlr 4 jar运行语法解决了该问题。