как функция exitXXX знает, какое правило соответствует - PullRequest
0 голосов
/ 25 января 2019

У меня в слушателе есть функция exitXXX, откуда она знает, каким правилам соответствует. В exitEffectiveAddress16 (), как я могу узнать, что оно соответствует «BX» + «DI» или «BP» + «SI»?

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

Спасибо, Питер

Ответы [ 2 ]

0 голосов
/ 26 января 2019

В вашей функции exitEffectiveAddress16 вы получаете EffectiveAddress16Context в качестве параметра. Он содержит функции-члены для каждого из указанных правил и токенов в этом правиле. Вы можете проверить их, если они возвращают != null, чтобы увидеть, соответствует ли это правило / токен. В тех случаях, когда одно и то же правило / токен может совпадать несколько раз в одном верхнем уровне alt , функция доступа к правилу / токену фактически возвращает массив, и вам необходимо дополнительное условие, чтобы определить, какое из совпадений было найдено. BX в вашем случае появляется только один раз в каждом alt, поэтому в функции доступа BX() есть только одно возвращаемое значение (то же самое для SI и DI).

Для получения дополнительной информации см. Объекты контекста правила в документации ANTLR4.

0 голосов
/ 25 января 2019

Вам нужно пометить альтернативы правил , чтобы получить эту специфику. Язык грамматики ANTLR предоставляет альтернативную метку, которая выглядит как комментарий Python, как показано ниже:

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

Когда вы сделаете это и восстановите своего посетителя и / или слушателя, вы найдете методы для переопределения для каждой из этих конкретных альтернатив для правила. Таким образом, вместо генерации одного обработчика для effectiveAddress16, вы получите один обработчик для каждой из помеченных альтернатив. Тогда вы точно знаете, какой из них соответствует.

...