我的侦听器中有一个exitXXX函数,它如何知道已匹配了哪些规则。在exitEffectiveAddress16()中,我怎么知道它匹配“ BX'+'DI”或“ BP'+'SI”?
effectiveAddress16 : 'byte [' (BX '+' SI
| BX '+' DI
| BP '+' SI
| BP '+' DI
| SI
;
感谢彼得
答案 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()
访问函数中只有一个返回值(与SI
和DI
相同)。>
有关更多信息,请参阅ANTLR4文档中的Rule Context Objects。