Генерация промежуточного и объектного кода с помощью ANTLR

В рамках программных заданий нашего класса компиляторов. Я предложил своему учителю использовать ANTLR вместо flex bison, и здесь он попросил меня убедиться, что он делает все, что нам нужно, то есть лексический, синтаксический и семантический анализ (три первых шага в изображение ниже), и я уверен, что очень легко создать такой анализатор с помощью ANTLR. но также промежуточный этап и этап генерации объектного кода компиляторами (остальные этапы на изображении ниже), и это действительно сбивает меня с толку. Я ожидал, что такой инструмент должен давать пользователям возможность создавать такие поколения, но я не нашел ничего, что объясняло бы, как это сделать, даже в справочнике, написанном автором.

введите здесь описание изображения

Может ли кто-нибудь здесь объяснить мне, как это сделать, или просто указать мне на письменный материал, который может помочь мне убедить моего учителя.


person Haroun Mohammedi    schedule 27.10.2017    source источник
comment
Это очень широкий вопрос. По сути, вы хотите знать, как создать компилятор с ANTLR в качестве основного компонента? Очень амбициозно. Я собрал ассемблер Z80 с помощью ANTLR, но не хотел бы создавать с его помощью компилятор.   -  person TomServo    schedule 27.10.2017
comment
@TomServo Я только что отредактировал свой вопрос, чтобы он был каким-то конкретным   -  person Haroun Mohammedi    schedule 27.10.2017


Ответы (1)


Короткий ответ заключается в том, что ANTLR хорошо подходит для реализации компилятора и, по крайней мере, является функциональным эквивалентом YACC/Bison для этой цели.

В зависимости от вашего вопроса ANTLR предоставляет поддержку Lexer (лексический анализ), Parser (синтаксический анализ) и обхода дерева (семантический анализ), все с соответствующими формами прослушивателя ошибок и механизмов восстановления. Пример таблицы символов находится в репозитории github.

Множественные обходы дерева обычно используются в семантическом анализе. Окончательный обход можно использовать для вывода некоторого промежуточного представления (IR) кода.

Чтобы понять, что участие в оставшихся шагах.

Книги профессора Парра Шаблоны реализации языка и TDAR поможет.

person GRosenberg    schedule 27.10.2017
comment
Вы говорите, что разработчик должен самостоятельно генерировать промежуточный код при обходе дерева, и это не делается с помощью инструмента генератора синтаксического анализатора? - person Haroun Mohammedi; 28.10.2017
comment
Да, это верно для ANTLR, YACC/Bison и всех других подобных парсеров. Семантический анализ дерева синтаксического анализа (или AST для других) в сочетании с таблицей символов является обязанностью разработчика. Для реального рендеринга IR используйте вспомогательную библиотеку ANTLR StringTemplate. - person GRosenberg; 28.10.2017
comment
не могли бы вы указать мне руководство по использованию StringTemplate для создания промежуточного и объектного кода - person Haroun Mohammedi; 06.11.2017