Iar*_*ica 1 parsing antlr antlr3
我正在研究一种具有两种当前"冲突"功能的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;} ;
Run Code Online (Sandbox Code Playgroud)
问题:规则span
无法正确解析其输入,因为它与DOUBLE
令牌冲突.词法分析器尝试匹配2..5
为a DOUBLE
并失败.以下是它在ANTLR Works中的外观:
解决这个冲突并正确解析两个INT
s的span
正确方法是什么?
PS我正在使用ANTLR 3而不是ANTLR 4,因为我将生成一个C#解析器,目前尚未在ANTLR 4中实现.
这个解决方案(第二个语法)工作正常.在将词法分析器规则转换为以下内容之后:
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
开始顺利工作一样.