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



我试图在不指定完整语法的情况下提取两个关键字(本例中为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);

相关内容

  • 没有找到相关文章

最新更新