Parsing 使用ANTLR 3解析由两个句点分隔的浮点数和范围
我正在为DSL开发一个解析器,该解析器目前有两个“冲突”特性: 像123.4这样的浮点数。 像ID[2..5]ID这样指定的范围被定义为'a'..'z'+并且没有多大关系。“[2..5]”部分最重要。 应该解析它的测试语法如下所示:Parsing 使用ANTLR 3解析由两个句点分隔的浮点数和范围,parsing,antlr,antlr3,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)(Int
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;} ;
问题:规则范围无法正确解析其输入,因为它与双令牌冲突。lexer试图将2..5作为双精度匹配,但失败了。以下是ANTLR的工作原理:
解决此冲突并正确解析span中的两个INT的正确方法是什么
另外,我使用的是ANTLR 3,而不是ANTLR 4,因为我要生成一个C解析器,它目前没有在ANTLR 4中实现。您上面发布的双重规则与。。运算符,因为“.”后面的“0”..“9”+至少包含一位数字。以下双精度的替代定义事实上会发生冲突:
DOUBLE : '0'..'9'+ '.' '0'..'9'*;
我怀疑您正在AntlWorks中使用解释器,这在许多情况下会给出错误的结果。您上面发布的双重规则与。。运算符,因为“.”后面的“0”..“9”+至少包含一位数字。以下双精度的替代定义事实上会发生冲突:
DOUBLE : '0'..'9'+ '.' '0'..'9'*;
我怀疑您在ANTLRWorks中使用了解释器,这在很多情况下会给出错误的结果。第二种语法很好用。在我将lexer规则转换为以下内容之后:
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这样的区间解析开始顺利进行。第二种语法很好。在我将lexer规则转换为以下内容之后:
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这样的区间解析开始顺利进行。可能与FYI重复,ANTLR4的C目标已经提前发布:@BartKiers我正在尝试将链接问题的答案改编成我的语法。一旦我完成了,我将以重复的形式结束问题,或者将语法作为解决方案发布。@BartKiers,这很有效,谢谢!另一个问题是它为什么有效。希望能尽快解决。仅供参考,ANTLR4的C目标已经提前发布:@BartKiers我正在尝试将链接问题的答案改编成我的语法。一旦我完成了,我将以重复的形式结束问题,或者将语法作为解决方案发布。@BartKiers,这很有效,谢谢!另一个问题是它为什么有效。希望能很快弄明白。好吧,当我从语法中去掉双重规则时,一切都很好。如果我将范围分隔符设置为,,而不是..,那么一切都可以正常工作。事实上,我在AntlWorks中使用intepreter,但在C中使用单元测试覆盖生成的解析器。好的,当我从语法中删除双精度规则时,一切都可以正常工作。如果我将范围分隔符设置为,,而不是..,那么一切都会正常工作。事实上,我在AntlWorks中使用intepreter,但在C中也使用单元测试覆盖生成的解析器。