如何使用ANTLR 4.4+进行模糊解析来消耗最小输入

时间:2015-02-25 18:42:26

标签: parsing antlr4

我正在尝试在两个关键字之间提取条件(在此示例中为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"

有人有想法吗?建议?

1 个答案:

答案 0 :(得分:0)

一种方法是(那个例子):

ifrule: IF  condition;
condition: ~(THEN|IF) condition | ~(THEN|IF);