Реализация goto в ast

Предыстория: В качестве короткого проекта во время зимних каникул я пытаюсь реализовать язык программирования Ax (разработанный для графических калькуляторов) с использованием Python и PLY. Краткое замечание: язык допускает только глобальные переменные и интенсивно использует указатели.

Я пытаюсь реализовать goto на этом языке, но не знаю, как это сделать.

Мой общий метод состоит в том, чтобы сначала использовать PLY для синтаксического анализа кода в ast, а затем пройтись по нему, выполняя по ходу дела.

Например, оператор

If 3
    Disp 4
    Disp 6
End

... превратился бы в ...

['PROGRAM', 
  ['BLOCK', 
    ['IF', 
      ['CONDITION', 3], 
      ['BLOCK', 
        ['DISP', 4], 
        ['DISP', 6]
      ]
    ]
  ]
]

... который я выполнял бы рекурсивно (я добавил отступы для удобства чтения).

Поскольку ast - это дерево, я не знаю, как переключаться между разными узлами. Я подумал о том, чтобы преобразовать дерево в плоский массив ['IF', ['CONDITION', 3], ['DISP', 4], ['DISP', 6]] , поэтому что я могу использовать индексы плоского массива для перехода к определенным строкам в коде, но в этом, кажется, отсутствует определенная элегантность, и это почти похоже на шаг назад (хотя я мог ошибаться).

Я просмотрел этот , но не смог понять, как это работает.

Мы будем благодарны за любую помощь или подсказки.

6
задан Community 23 May 2017 в 12:22
поделиться