2013-05-05 49 views
0

我试图解决这个问题(删除我的语法中的回溯),但是我没有成功,这是我的语法代码:我在“ 条件“规则ANTLR:由于递归规则导致的非LL(*)决策

grammar Sample3; 

options { 
    language = Java; 
    output=AST; 
    ASTLabelType=CommonTree; 
} 
tokens{ 
    NEGATION; 
} 
@header { 
    package com.tuto.antlr; 
} 

@lexer::header { 
    package com.tuto.antlr; 
} 
program 
    : conditions EOF! 
    ; 
conditions 
    : condition (('and'^ | 'or'^)condition)* 
    ; 
condition 
    : relation (('and'^ | 'or'^)relation)* 

    ; 
relation 
    : expression(('='^ | '<'^ | '>'^ | '<='^ | '>='^ | '<>'^)expression)+ 
    //| '('expression(('='^ | '<'^ | '>'^ | '<='^ | '>='^ | '<>'^)expression)+')' 
    ; 

term 
    : POSITIVE_NUMBER 
    | IDENT 
    | '('! expression ')'! 
    ; 
unary 
    : ('+'! | negation^)* term 
    ; 
negation 
    : '-' -> NEGATION 
    ; 
multi 
    : unary (('*'^ | '/'^ | '%'^)unary)* 
    ; 
expression 
    : multi(('+'^ | '-'^)multi)* 
    ; 

IDENT:('a'..'z' | 'A'..'Z')('a'..'z' | 'A'..'Z'|'0'..'9')*; 
POSITIVE_NUMBER:'0'..'9'+ ('.' ('0'..'9')+)?; 
//NEGATIVE_NUMBER:'-''0'..'9'+ ('.' '0'..'9'+)?; 
WS : (' '|'\n'|'\r'|'\t')+ {$channel = HIDDEN;}; 
COMMENT:'//' .* ('\n' | '\r') {$channel = HIDDEN;}; 
MULTI_COMMENT : '/*' .* '*/' {$channel = HIDDEN;} ; 

我试图使用前请先添加原路=真正的选择,但没什么...... 任何一个可以帮助我,please.Thanks。

回答

0

试试这个:

conditions 
    : relation (('and'^ | 'or'^)conditions)* 
    ; 

,将匹配关系的任何名单。删除“条件”生产。我会推荐你​​检查龙的书。

+0

谢谢,它的工作原理。再次感谢。 – user2351081 2013-05-05 12:14:52