2013-05-05 57 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