Antlr exitXXX函数如何知道已匹配的规则

Antlr exitXXX函数如何知道已匹配的规则,antlr,antlr4,Antlr,Antlr4,我的侦听器中有一个exitXXX函数,它如何知道匹配了哪些规则。在exitEffectiveAddress16()中,我如何知道它与“BX'+'DI”或“BP'+'SI”匹配 谢谢Peter您需要为您的规则备选方案添加标签,以获得特定性。ANTLR语法语言提供了替代标签,它看起来像python注释,如下所示: effectiveAddress16 : 'byte [' (BX '+' SI # effAddBXSI | BX '+' DI

我的侦听器中有一个exitXXX函数,它如何知道匹配了哪些规则。在exitEffectiveAddress16()中,我如何知道它与“BX'+'DI”或“BP'+'SI”匹配


谢谢Peter

您需要为您的规则备选方案添加标签,以获得特定性。ANTLR语法语言提供了替代标签,它看起来像python注释,如下所示:

effectiveAddress16  :   'byte [' (BX '+' SI     # effAddBXSI
            |   BX '+' DI                       # effAddBXDI
            |   BP '+' SI                       # effAddBPSI
            |   BP '+' DI                       # effAddBPDI
            |   SI                              # effAddSI
            ;

当您执行此操作并重新生成访问者和/或侦听器时,您将找到为规则的每个特定备选方案重写的方法。因此,不是为
effectiveAddress16
生成一个处理程序,而是为每个标记的备选方案生成一个处理程序。然后您就可以确定哪一个匹配了。

您需要为您的规则备选方案添加标签,以获得特定性。ANTLR语法语言提供了替代标签,它看起来像python注释,如下所示:

effectiveAddress16  :   'byte [' (BX '+' SI     # effAddBXSI
            |   BX '+' DI                       # effAddBXDI
            |   BP '+' SI                       # effAddBPSI
            |   BP '+' DI                       # effAddBPDI
            |   SI                              # effAddSI
            ;

当您执行此操作并重新生成访问者和/或侦听器时,您将找到为规则的每个特定备选方案重写的方法。因此,不是为
effectiveAddress16
生成一个处理程序,而是为每个标记的备选方案生成一个处理程序。然后您就可以确定哪一个匹配了。

exitefectiveaddress16
函数中,您将获得一个
有效地址16上下文作为参数。其中包含每个被引用规则的成员函数以及该规则中的标记。如果它们返回
!=null
以查看该规则/令牌是否已匹配。在同一规则/令牌可以在单个顶级alt中多次匹配的情况下,规则/令牌访问函数实际上返回一个数组,您需要一个附加条件来确定匹配的事件。在您的例子中,
BX
在每个alt中只出现一次,因此在
BX()
访问函数中只有一个返回值(与
SI
DI
相同)


有关更多信息,请参阅ANTLR4文档。

在您的
exitEffectiveAddress16
函数中,您将获得一个
有效地址16context
作为参数。其中包含每个被引用规则的成员函数以及该规则中的标记。如果它们返回
!=null
以查看该规则/令牌是否已匹配。在同一规则/令牌可以在单个顶级alt中多次匹配的情况下,规则/令牌访问函数实际上返回一个数组,您需要一个附加条件来确定匹配的事件。在您的例子中,
BX
在每个alt中只出现一次,因此在
BX()
访问函数中只有一个返回值(与
SI
DI
相同)


有关更多信息,请参阅ANTLR4文档。

谢谢大家。最后,我在语法中添加了:returns[xxx]。谢谢大家。我最终通过在语法中添加:returns[xxx]解决了这个问题。