使用ANTLR 3解析由两个句点分隔的浮点数和范围

Iar*_*ica 1 parsing antlr antlr3

我正在研究一种具有两种当前"冲突"功能的DSL解析器:

  1. 浮点数就像123.4.
  2. 指定的范围ID[2..5](ID被定义为'a'..'z'+并且无关紧要.部分'[2..5]'最重要.

应解析它的测试语法如下所示:

grammar DotTest;

span returns [double value] 
  : ID'['e=INT'..'f=INT']' { /*some code to process the values*/ $value = (double)(Int32.Parse($e.text) + Int32.Parse($f.text)); } ;

num returns [double value]
  : DOUBLE {$value = double.Parse($DOUBLE.text); } ;

INT     : '0'..'9'+ ;
DOUBLE  : '0'..'9'+'.''0'..'9'+ ;
ID      : 'a'..'z'+ ;

WS      :   ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;} ;
Run Code Online (Sandbox Code Playgroud)

问题:规则span无法正确解析其输入,因为它与DOUBLE令牌冲突.词法分析器尝试匹配2..5为a DOUBLE并失败.以下是它在ANTLR Works中的外观:

不匹配的令牌异常.

解决这个冲突并正确解析两个INTs的span正确方法是什么?

PS我正在使用ANTLR 3而不是ANTLR 4,因为我将生成一个C#解析器,目前尚未在ANTLR 4中实现.

Iar*_*ica 5

这个解决方案(第二个语法)工作正常.在将词法分析器规则转换为以下内容之后:

NUM : (INT RNG)=> INT {$type=INT;}  

    | (DOUBLE)=> DOUBLE {$type=DOUBLE;}

    | INT {$type=INT;};


fragment INT :  '0'..'9'+ ;
fragment DOUBLE :   '0'..'9'+'.''0'..'9'+ ;

RNG: '..' ;
Run Code Online (Sandbox Code Playgroud)

解析间隔就像1..2开始顺利工作一样.