1

我正在为具有两个当前“冲突”功能的 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;} ;

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

不匹配的令牌异常。

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

PS我使用的是 ANTLR 3 而不是 ANTLR 4,因为我要生成一个 C# 解析器,目前在 ANTLR 4 中没有实现。

4

2 回答 2

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: '..' ;

解析间隔之类的1..2开始工作顺利。

于 2013-04-17T07:53:52.180 回答
1

您在上面发布的规则与运营商DOUBLE不冲突,因为以下规则至少包含一位数字。以下替代定义实际上会发生冲突:..'0'..'9'+'.'DOUBLE

DOUBLE : '0'..'9'+ '.' '0'..'9'*;

我怀疑您在 ANTLRWorks 中使用了解释器,众所周知,它在许多情况下会给出不正确的结果。

于 2013-04-16T13:09:09.273 回答