我试图解决这个问题(删除我的语法中的回溯)但是我没有成功,这是我的语法代码:我在“条件”规则中遇到问题
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但没有... 请允许任何人帮助我。谢谢你的到来。
答案 0 :(得分:0)
试试这个:
conditions
: relation (('and'^ | 'or'^)conditions)*
;
这将匹配任何关系列表。删除'条件'生产。我会建议你查看Dragon的书。