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

时间:2019-01-25 14:21:20

标签: antlr antlr4

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

effectiveAddress16  :   'byte [' (BX '+' SI 
            |   BX '+' DI
            |   BP '+' SI
            |   BP '+' DI
            |   SI
            ;

感谢彼得

2 个答案:

答案 0 :(得分:1)

您需要标记规则替代项以获取这种特异性。 ANTLR语法语言提供了替代标签,看起来像python注释,如下所示:

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

执行此操作并重新生成访问者和/或侦听器时,您将找到方法来替代规则的所有这些特定替代方法。因此,您将不会为effectiveAddress16生成一个处理程序,而是为每个标记的替代项获得一个处理程序。然后您确定知道哪一个匹配。

答案 1 :(得分:1)

在您的exitEffectiveAddress16函数中,您将获得一个EffectiveAddress16Context作为参数。它包含每个引用规则的成员函数以及该规则中的标记。您可以检查它们是否返回!= null,以查看该规则/令牌是否已匹配。如果同一规则/令牌可以在单个顶级alt中多次匹配,则规则/令牌访问功能实际上会返回一个数组,并且您需要附加条件来确定哪些匹配的事件。您所用的BX在每个alt中仅出现一次,因此BX()访问函数中只有一个返回值(与SIDI相同)。

有关更多信息,请参阅ANTLR4文档中的Rule Context Objects