Вовсе не Кабек сказал(а):
↑ В этом семаке у меня курсач - написать компилятор на С++ для какого-нибудь другого компилируемого ЯП(я выбрал golang)
Собственно, сижу пишу его, но почему то не могу найти нигде примеров самописных компиляторов
Вроде разобрался как писать лексер и парсер, но чет генератор кода на ASSэмблере меня пугает
Собственно, мб кто знает, где посмотреть примеры самописных компилей? Или годный гайд как это написать?
Нажмите, чтобы раскрыть...
В книге "Lisp in small pieces" есть целая глава, посвящённая реализации компиляторов, так же как в классическом учебнике SICP последняя глава посвящена компиляторам. Они про scheme, но он настолько простой, что можно легко разобраться в основных алгоритмах. Обе книги переведены на русский.
Но конечно же самой главной работой здесь была, есть и будет книга "Компиляторы: принципы, технологии и инструменты", так же известная как "книга дракона". Это то, что можно местами пролистать, процитировать, указать в списке литературы.
Теперь что касается основных шагов, которые нужно выполнить.
Я не уверен, каким компилятором и операционной системой ты пользуешься, но для gcc есть флаг компиляции -S, который позволяет компилировать не в исполняемый файл, а в ассемблерный код. Подозреваю, что в gccgo он тоже есть. Эта штука тебе очень пригодится, чтобы видеть, что генерирует уже готовый компилятор.
Далее тебе понадобится написать свой лексер(или токенизатор), анализатор и непосредственно генератор кода.
Токенизатор считывает файл построчно и разбивает строку на токены, т.е. некие языковые единицы, такие как открывающие и закрывающие скобки, арифметические операторы, операторы присваивания, ключевые слова(типа return, func и т.д.), числа, строки(и соответственно кавычки).
Потом анализатор преобразует токены в так называемое AST-дерево, чаще всего для его реализации используют метод рекурсивного спуска(вот пример реализации): https://ru.wikibooks.org/wiki/%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D0%BF%D1%83%D1%81%D0%BA%D0%B0
Ну и наконец генератор ассемблера.
Примеры реализации:
https://rosettacode.org/wiki/Compiler/code_generator
Если тебе нужны примеры именно исходников, и проще учиться по ним, вот тебе действительно маленький и простой компилятор C стандарта 99-го года:
https://github.com/Wilfred/babyc
А, соре, невнимательно прочитал тему. Но в общем в любом случае пример компилятора есть выше.