我正在为具有两个当前“冲突”功能的 DSL 开发解析器:
- 浮点数,如
123.4
. - 指定的范围如
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 中的外观:
解决此冲突并正确解析两个INT
s 的span
正确方法是什么?
PS我使用的是 ANTLR 3 而不是 ANTLR 4,因为我要生成一个 C# 解析器,目前在 ANTLR 4 中没有实现。