首页 > 解决方案 > 由于递归规则调用,ANTLR3 错误规则具有非 LL(*) 决策

问题描述

我正在尝试使用 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 简化版本,包括分配、连接、添加和删除元素以及对列表进行切片。

还有一个理解部分来解析形式的列表表达式:[expression for x in list if condition]

标签: javapythonantlr

解决方案


用 antlr 4 jar 运行语法解决了这个问题。


推荐阅读