Antlr 每次重复长度增加的数字块序列的语法规则

Antlr 每次重复长度增加的数字块序列的语法规则,antlr,antlr4,Antlr,Antlr4,我想生成一个解析规则(使用ANTLR 4),该规则定义由“:”分隔的二进制块的重复链 每个块比前一个块多一个数字,从两个数字开始。例如: 01:010:0001:01010 ... 链可以有任意数量的这些块 现在,我将规则定义为: BIN : [0-1]+ ; connections : BIN (':' BIN)* ; 我知道如何让它检查每个块至少有两个二进制数字,但不是正确的数字。 有没有办法让它更具体一些,使用ANTLR?和一个语义谓词,它看起来像这样: connections loc

我想生成一个解析规则(使用ANTLR 4),该规则定义由“:”分隔的二进制块的重复链

每个块比前一个块多一个数字,从两个数字开始。例如:

01:010:0001:01010 ...
链可以有任意数量的这些块

现在,我将规则定义为:

BIN : [0-1]+ ;
connections : BIN (':' BIN)* ;
我知道如何让它检查每个块至少有两个二进制数字,但不是正确的数字。
有没有办法让它更具体一些,使用ANTLR?

和一个语义谓词,它看起来像这样:

connections locals[int i] :
   {$i = 2;} BIN {check}? ({$i++;} ':' BIN {$check}?)* ;

BIN :
   [0-1]+ ;
其中,
check
$BIN.getText().length()=$i
(替换check以使语法正常工作)


另一个选项是生成解析树访问者,并在遍历解析树时验证BIN节点。

这不是上下文无关语言,因此需要使用某种语义谓词。也许你需要让这个问题对ANTLR更具体。@rici你说的更具体是什么意思?我是ANTLR的新手。缺少了什么吗?我的意思是,您正在寻找ANTLR解决方案的唯一提示是标记。当我看到标记时,我正要回答(用一般注释),所以我把它改为注释:您需要使用特定于ANTLR的语义谓词(我不是ANTLR用户,所以我不能给您更多的指导)。在编辑问题之前,您可能需要仔细阅读它们并进行尝试。@rici我已经删除了一般的“parsing”标记,并在问题中指定了ANTLR。应该说得更清楚。我将尝试用语义谓词来解决它,谢谢。我试图自己解决这个问题,但朝着正确的方向轻推是非常受欢迎的。