Parsing 如何使用ANTLR 4.4+使用模糊解析消耗最小输入;

Parsing 如何使用ANTLR 4.4+使用模糊解析消耗最小输入;,parsing,antlr4,Parsing,Antlr4,我试图在不指定完整语法的情况下提取两个关键字之间的条件(本例中为IF&THEN)。 解析器的输入以第一个关键字开始。 输入示例可以是:“如果A5,则A=A+1;B=6;ENDIF;如果A

我试图在不指定完整语法的情况下提取两个关键字之间的条件(本例中为IF&THEN)。 解析器的输入以第一个关键字开始。 输入示例可以是:“如果A<10或B>5,则A=A+1;B=6;ENDIF;如果A<10,则A=100 ENDIF” 从该输入中,我想提取条件:“A<10或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; }
};
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);
语法模糊测试3;
选择权
{
输出=AST;
语言=Java;
}
@标题
{包fuzzytest;}
@lexer::header
{包fuzzytest;}
如果规则:如果。*那么;
如果:‘如果’;
然后:"然后",;
标识符:('a'..'z'|'a'..'z'|'0'..'9'|')*;
分隔符:(“|”):“(“|”)”|“-“|”+“|”=”|“);
WS:(“|”\t“|”\r“|”\n“|”\u000C”)+
{
{$channel=HIDDEN;}
};
**4.4语法**

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; }
};
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);
语法模糊测试4;
如果规则:如果(.)*?然后
//如果规则:如果。*那么//同样的结果
如果:‘如果’;
然后:"然后",;
标识符:('a'..'z'|'a'..'z'|'0'..'9'|')*;
分隔符:(“|”):“(“|”)”|“-“|”+“|”=”|“);
WS:(“|”\t“|”\r“|”\n“|”\u000C')->通道(隐藏);
对于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"
ParserRuleReturnScope rulereturn=parser.ifrule();
结果=parser.input.toString(rulereturn.start,rulereturn.stop);
System.out.println(“令牌:+结果);
我的输出是:
“令牌:如果A<10或B>5,则”
对于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"
ParserRuleContext rulereturn=parser.ifrule();
结果=parser.getInputStream().getText(rulereturn.start,rulereturn.stop);
System.out.println(“令牌:+结果);
我的输出是:
“第2行:76在输入端没有可行的替代方案”
标记:如果A<10或B>5,则A=A+1;B=6;ENDIF;如果A<10,则A=100 ENDIF“
有人有主意吗?建议?

一种方法是(这个例子是什么):