我试图在不指定完整语法的情况下提取两个关键字(本例中为IF&THEN)之间的条件。解析器的输入以第一个关键字开始。输入示例可以是:"如果A<10或B>5,则A=A+1;B=6;ENDIF;如果A>10,则A=100 ENDIF"从这个输入中,我想提取条件:"A<10 OR B>5"。
我们使用了ANTLR 3.5,但无法使用ANLTR 4.4&4.5.
**3.5语法**
grammar FuzzyTest3;
options
{
output=AST;
language=Java;
}
@header
{package fuzzytest;}
@lexer::header
{package fuzzytest;}
ifrule: IF .* THEN;
IF : 'IF';
THEN : 'THEN';
IDENTIFIER : ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
SEPARATOR : ( '<' | '>' | ':' '(' | ')' | '-' | '+' | '=' | ';' );
WS : ( ' ' | 't' | 'r' | 'n' | 'u000C')+
{
{ $channel = HIDDEN; }
};
**4.4语法**
grammar FuzzyTest4;
ifrule: IF (.)*? THEN;
//ifrule: IF .* THEN; //same result
IF : 'IF';
THEN : 'THEN';
IDENTIFIER : ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
SEPARATOR : ( '<' | '>' | ':' '(' | ')' | '-' | '+' | '=' | ';' );
WS : ( ' ' | 't' | 'r' | 'n' | 'u000C') -> channel(HIDDEN);
使用ANTLR 3.5:
ParserRuleReturnScope rulereturn = parser.ifrule();
result = parser.input.toString(rulereturn.start, rulereturn.stop);
System.out.println("TOKENS: "+result);
My output is :
"TOKENS: IF A < 10 OR B> 5 THEN"
使用ANLTR 4.4:
ParserRuleContext rulereturn = parser.ifrule();
result = parser.getInputStream().getText(rulereturn.start, rulereturn.stop);
System.out.println("TOKENS: "+result);
My output is :
"line 2:76 no viable alternative at input '<EOF>'
TOKENS: IF A < 10 OR B> 5 THEN A = A + 1; B=6; ENDIF; IF A < 10 THEN A = 100 ENDIF"
有人有主意吗?建议
一种方法是(例如):
ifrule: IF condition;
condition: ~(THEN|IF) condition | ~(THEN|IF);