Я на самом деле ребенок, хаха. Я никогда раньше не писал реальный компилятор и не проектировал язык, но я закончил «Книгу Красного Дракона», поэтому я полагаю, что у меня есть идея (надеюсь).
Это будет зависеть в первую очередь от грамматики. Если это LR или LALR, я думаю, что инструменты вроде Bison / Flex будут работать хорошо. Если это больше LL, я бы использовал Spirit , который является компонентом Boost. Это позволяет вам писать грамматику языка в C ++ в EBNF-подобном синтаксисе, так что не нужно путаться с генераторами кода; компилятор C ++ компилирует грамматику для вас. Если что-то из этого не получится, я напишу грамматику EBNF на бумаге, а затем приступлю к выполнению какого-то тяжелого рекурсивного разбора спуска, что, похоже, работает; если C ++ может быть достаточно хорошо проанализирован с использованием RDP (как это делает GCC), то, я полагаю, с достаточным количеством модульных тестов и терпением вы могли бы написать целые компиляторы с использованием RDP.
Как только у меня будет запущен парсер и какое-то промежуточное представление, это будет зависеть от того, как он работает. Если это какой-то байт-код или компилятор собственного кода, я буду использовать LLVM или libJIT для его обработки. LLVM больше подходит для общей компиляции, но мне больше нравится API libJIT и документация. В качестве альтернативы, если я действительно ленив, я сгенерирую код на C и позволю GCC выполнить фактическую компиляцию. Другой альтернативой является нацеливание на существующую виртуальную машину, такую как Parrot, JVM или CLR. Parrot - это виртуальная машина, разработанная для Perl. Если это просто интерпретатор, я пройдусь по дереву синтаксиса.
Радикальной альтернативой является использование Пролога, который имеет синтаксические особенности, которые замечательно имитируют EBNF. Хотя у меня нет опыта работы с ним, и если я не ошибаюсь (что я почти наверняка буду), Prolog будет довольно медленным, если его использовать для синтаксического анализа тяжелых языков программирования с множеством синтаксических конструкций и причуд (читай: C ++ и Perl).
Все это я буду делать на C ++, хотя бы потому, что я более привык писать на нем, чем C. Я бы держался подальше от Java / Python или чего-либо подобного для реального производственного кода (написание компиляторов на C / C ++ помогает сделать его переносимым), но я мог видеть себя использующим их в качестве языка прототипирования, особенно Python, к которому я неравнодушен. Конечно, я никогда не делал ничего подобного раньше, поэтому я не из тех, кто скажет.