ANTLR:由于递归规则而导致的非LL(*)决策

时间:2013-05-05 02:47:18

标签: antlr grammar

我试图解决这个问题(删除我的语法中的回溯)但是我没有成功,这是我的语法代码:我在“条件”规则中遇到问题

    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;} ;

我试图在选项中添加backtrack = true但没有... 请允许任何人帮助我。谢谢你的到来。

1 个答案:

答案 0 :(得分:0)

试试这个:

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

这将匹配任何关系列表。删除'条件'生产。我会建议你查看Dragon的书。