Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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
Antlr 使AST节点成为递归规则的最低子代_Antlr - Fatal编程技术网

Antlr 使AST节点成为递归规则的最低子代

Antlr 使AST节点成为递归规则的最低子代,antlr,Antlr,我试图创建一个解析器规则,它允许在第二个规则之前有零个或多个令牌,并且在AST中,每个后续令牌(作为闭包一部分的令牌)都是前一个令牌的子级,第二个规则也是最后一个符号的子级 通过例子更容易解释 expression11 : ((NOT | COMPLEMENT)^)* expression12; 例如,给定上述解析器规则,如果我有表达式!!x(其中x是一个ID),在我的AST中,我希望x是第二个bang操作符的子对象,它是第一个bang操作符的子对象 期望的: ! \ child

我试图创建一个解析器规则,它允许在第二个规则之前有零个或多个令牌,并且在AST中,每个后续令牌(作为闭包一部分的令牌)都是前一个令牌的子级,第二个规则也是最后一个符号的子级

通过例子更容易解释

expression11 : ((NOT | COMPLEMENT)^)* expression12;
例如,给定上述解析器规则,如果我有表达式!!x(其中x是一个ID),在我的AST中,我希望x是第二个bang操作符的子对象,它是第一个bang操作符的子对象

期望的:

!
  \ child
    !
      \ child
       x
与我期望的行为不同,上面的行生成了一个AST,其中第二个bang操作符是第一个的子操作符,而x是第一个bang操作符的子操作符,第二个的兄弟操作符。显然不是我想要的一元运算符

遇到的行为:

        !
child /   \ child
    x -sib- !
如果我添加第三个操作符(如“!!!x”)第三个操作符将成为第二个操作符的子操作符(如预期的那样),而x将仍然是第一个操作符的子操作符,第二个操作符的兄弟操作符

我想也许我可以通过用括号包围整个操作符部分并添加另一个插入符号来解决这个问题,例如

expression11 : (((NOT | COMPLEMENT)^)*)^ expression12;
为了迫使expression12成为运算符整个闭包的子对象,徒劳地希望这会被解释为“整个闭包的子对象意味着最下级的子对象”,但事实并非如此,这样做根本不会改变行为

我的问题是“如何让解析器以这样的方式处理规则,即expression12的结果成为最下级的“NOT”或“complete”节点的子节点,而不是最高的上级节点?”

我本以为这很简单,但我无法从Antlr.org上的Antlr资源中找到答案,也无法向谷歌求情。必须一直这样做,还是有一种不同的方式来构建我完全忽略的规则

以下是完整性规则。他们还没有完成,将被修改,但他们是完整的,并为测试工作,一切都很好与他们-正如预期的那样,因为他们是直截了当的。12表示数组长度和方法调用,13表示新类和数组,14表示数组索引,15表示终端/括号

expression12 : expression13 (DOT (LENGTH | (ID LPAREN (expression (COMMA expression)*)? RPAREN)))?;
expression13 : expression14 | (NEW^ ((ID LPAREN RPAREN) | (INTTYPE LSQBRACK expression RSQBRACK)));
expression14 : expression15 (LSQBRACK expression RSQBRACK)*;
expression15 : (LPAREN expression RPAREN) | INTLIT | TRUE | FALSE | ID | THIS;

感谢所有能够提供帮助的人;非常感谢您的时间。

如果您不希望操作符显示为兄弟,则不能使用Kleene星形。尝试类似(未经测试)的方法


我必须说你对规则名称的选择相当混乱。除此之外,还有一个好的、详细的问题+1@Bart基尔斯:这都是我的大表达式规则的一部分,每个表达式n规则都有不同的优先级,表达式1是我的最低优先级运算符(逻辑OR),表达式15是最高优先级运算符。也许不是其他人的做法,但我做的时间不长,我还在学习。在使用您的答案后,我终于在antlr邮件列表()中找到了答案。我以为它一定存在于某个地方。不管怎么说,简单又有效;多谢各位。
expression11 : (NOT | COMPLEMENT)^ expression11
             | expression12;