Соответствие аналогичным терминам в ANTLR без учета разницы

В рамках задачи nand2tetris я пытаюсь написать парсер с использованием ANTLR для генерации машинного кода, уже реализовав его с помощью регулярных выражений.

Тем не менее, я изо всех сил пытаюсь понять, как эффективно использовать ANTLR. Подмножество проблемы ниже.

(Некоторые) Действительные инструкции

 M=D
 D=M
 M=D+1
 D;JMP
 0;JMP

A (частичное) регулярное выражение

(?<assignment>(?<destination>[ADM])=)?(?<computation>[ADM+10])(?<condition>;(?<jump>JMP))?

(Частичная) грамматика

command
     : assignment '=' computation
     | computation ';' condition
     | assignment '=' computation ';' condition
     ;

assignment
     : ASSIGNMENT
     ;

computation
     : OPERATION
     ;

condition
     : CONDITION
     ;

ASSIGNMENT
     : DESTINATION
     ;

CONDITION
     : JUMP
     ;

DESTINATION
     : 'A'
     | 'D'
     | ...etc
     ;

OPERATION
     : 'A'
     | 'D'
     | 'A+D'
     | ... etc
     ;

JUMP
     : JMP
     | JLE
     | etc...
     ;

Теперь, как вы можете видеть, лексер будет смешиваться между тем, что является вычислением, и тем, что является присваиванием, так как оба могут быть 'A'...

Однако, если я изменю НАЗНАЧЕНИЕ на

ASSIGNMENT
  : DESTINATION '='
  ;

и команда

command
  : assignment computation
  | etc...

затем назначение поднимает знак равенства.

Итак, я пытаюсь сопоставить до двух токенов (FOO и FOO=) в разных контекстах, но меня не интересует =, только FOO.

Я лаю не на том дереве полностью с нынешним подходом?

0 ответов

Другие вопросы по тегам