我正在尝试在两个关键字之间提取条件(在此示例中为IF& THEN),而不指定完整语法。 解析器的输入以第一个关键字开头。 输入示例可以是:" IF A< 10 OR B> 5那么A = A + 1; B = 6;万一;如果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"
有人有想法吗?建议?
答案 0 :(得分:0)
一种方法是(那个例子):
ifrule: IF condition;
condition: ~(THEN|IF) condition | ~(THEN|IF);