Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 使用ANTLR 3解析由两个句点分隔的浮点数和范围_Parsing_Antlr_Antlr3 - Fatal编程技术网

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

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

我正在为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;} ;
问题:规则范围无法正确解析其输入,因为它与双令牌冲突。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中也使用单元测试覆盖生成的解析器。