Преобразование абстрактного синтаксического дерева в байт-код - PullRequest
7 голосов
/ 17 июля 2011

Я пытаюсь научиться создавать простой компилятор как хобби. Я ориентируюсь на виртуальную машину Java.

Я написал простую грамматику, используя плагин ANTLR для Eclipse.

Кто-то сказал мне, что в AST, сгенерированном Antlr, есть нечто, известное как узел метода, и его нужно вызвать. Я планирую использовать ASM для генерации байт-кода. Итак, что такое узел метода и как я вызываю его из ASM и заставляю его посещать инструкции метода?

А также семантический анализатор компилятора. Это должно быть написано вручную или есть генераторы для этого?

1 Ответ

3 голосов
/ 25 октября 2011

Вы задаете много не связанных между собой вопросов здесь.В зависимости от языка, который вы определили, на вашем языке может быть узел метода или не будет, скажем, если ваш язык безоговорочно компилируется в метод main(String[]).

Существует несколько подходов для преобразованияАСТ на целевой язык.В большинстве случаев вы не будете генерировать код напрямую, а создадите AST для своей целевой платформы и получите симпатичный принтер для генерации кода из него, используя treewalker.

Семантический анализ - это программированиекомпилятор.Чтение и понимание ввода на синтаксическом уровне является анализом.Вам нужно будет написать семантический анализатор самостоятельно, иначе вы бы вообще не написали компилятор.; -)

Полагаю, вы используете Jasmin для компиляции кода сборки?Очень хорошим началом было бы написание грамматик для вашего языка ввода и целевого языка (Jasmin) и подумать, какие структуры ввода будут отображать, какой вывод.Как написать цикл for i := 1 to 10 в Жасмин?Решайте небольшие проблемы и расширяйте свой компилятор по мере необходимости, но медленно, проводя раннее и тщательное тестирование недавно реализованных преобразований.

A очень хорошее чтение: Давайте создадим компилятор, выполнивДжек Креншоу .

...