ANTLR GOTO заявление - PullRequest
       27

ANTLR GOTO заявление

0 голосов
/ 04 февраля 2020

Я работаю над простым парсером для кода:

DEF Test( )

a = false
b = false
c = false

IF a THEN
  GOTO LabelA
ENDIF

IF b THEN
  GOTO LabelB
ENDIF

IF c THEN
  GOTO LabelC
ENDIF

GOTO LabelD

LabelA:
$OUT[1]=TRUE

LabelB:
$OUT[2]=TRUE

LabelC:
$OUT[3]=TRUE

LabelD:
$OUT[4]=TRUE

END

На данный момент я могу написать посетителю и оценить IF оператор. Но моя цель - иметь возможность выполнять операторы GOTO и Label . К сожалению, я не смог найти аналогичного решения для C ++. Кто-нибудь может дать мне совет, как сделать заявление GOTO в посетителе ANTLR? Или, может быть, есть другое решение?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Ваше предложение пройти через дерево дважды было самой простой и лучшей идеей. В моем парсере я делаю еще больше. Я хожу по своему дереву столько раз, сколько я sh, каждый раз, когда у меня есть заявление goto. Это может вызвать бесконечность l oop, но это другой вопрос, если разобранная программа написана хорошо. Это не лучшее решение, но идеально подходит для моей проблемы. Спасибо всем большое за помощь.

0 голосов
/ 04 февраля 2020

Вы можете сделать это с двумя проходами через дерево. На первом проходе соберите список узлов, которые соответствуют метке. На втором проходе сделайте прогулку по дереву, чтобы интерпретировать утверждение. Эта идеализированная машина имеет IP-адрес, называемый «указателем инструкций» для узла в дереве оператора. Большинство операторов тривиально выполнить, изменяя состояние переменных и где следующий IP - следующий узел дерева для выполнения. Однако, когда вы посещаете оператор goto, вам необходимо настроить IP для нового узла, соответствующего метке. В дополнение к IP-регистру этой идеализированной машины вам необходимо будет представить переменные, массивы и базовые типы c. Вам нужно подумать о том, как найти узел дерева для следующего оператора. Не ясно, хотите ли вы также определить процедуры. Если это так, вам также понадобится стек вызовов. Если вы намереваетесь представить программу в виде байт-кода, а не в виде дерева разбора, вы пишете транслятор, также называемый компилятором и виртуальной машиной. Похоже, что вы новичок в этом, и это для небольшого проекта, я бы порекомендовал вам интерпретировать дерево как есть. Эта проблема будет тем, что вы увидите в первом курсе по компиляции.

...