Прежде чем я начну: да мне действительно нужен (/ хочу) DSL (даже если это просто для опыта), нет другого формата, который выражал бы то, что я пытаюсь сделать, в не очень - подробный, безопасный по типам способ.
Некоторая справочная информация, актуальный вопрос внизу
Я хочу создать DSL-компилятор для своего проекта (TypeScript), и, поскольку язык разделяет много синтаксиса и концепций с самим TypeScript (я разработал его таким образом), я подумал о повторном использовании частей компилятора TypeScript, чтобы избежать повторного использования. -изобретая колесо. Меня больше всего интересуют scanner
, parser
и binder
. Другая семантика и генерирующие части моего DLS настолько отличаются от TypeScript, что я почти уверен, что будет более эффективно написать его с нуля.
Я нашел этот сайт, на котором объясняется, как на самом деле работает компилятор (хотя Я почти уверен, что это немного устарело), и пока я все хорошо понимаю. Насколько я понимаю, нет причин, по которым я должен изобретать велосипед, если я могу расширить компилятор TypeScript.
Первая часть, конечно же, scanner
. Я попытался просканировать файл на моем языке, чтобы увидеть, что произойдет. , оказывается, все, о чем tsc не знает, классифицируется (SyntaxKind
) как Identifier
(что имеет смысл). Чтобы реализовать свой DLS, мне пришлось бы добавить в этот сканер ключевые слова и типы синтаксиса, которые будут отправлены в parser
для создания AST. Мне, конечно же, придется продлить parser
, но сейчас это не моя забота.
Моим первым побуждением было просто клонировать репозиторий TypeScript и добавить необходимую логику. Таким образом, я мог бы использовать тот же API, что и на вышеупомянутом сайте, но с моими добавленными ключевыми словами / синтаксисом / AST-узлами. Затем я бы написал семантические проверки и фактически выдал сгенерированный результат с нуля, и все было бы хорошо.
К сожалению, это не сработало (отсюда и этот вопрос). Первым препятствием был просто размер и структура репозитория, я просто не знал, где мне искать. Я попытался создать небольшую программу, которая использовала бы локальный источник вместо встроенного, но это тоже не сработало (вероятно, из-за сложного конвейера, через который проходит tsc до того, как он перейдет в какое-либо пригодное для использования состояние). Я нашел файлы compiler.ts
, parser.ts
и т. Д., Но без возможности использовать мою пользовательскую версию они не имели особого смысла. Я пытался скопировать только те файлы, которые, как я думал, мне понадобятся, в мой собственный проект, но это вызвало всевозможные опечатки и отсутствующие функции, и я понятия не имею, как (и если) мне их исправить. Что еще хуже: некоторые файлы содержали ошибки компиляции, когда я пытался скомпилировать их в своей собственной среде (ослабление tsconfig.json
настроек не помогло).
Актуальный вопрос
У меня три вопроса:
- Хорошая идея - попробовать расширить полезные части компилятора TypeScript, или я должен просто написать с нуля? (Я в основном говорю о компонентах
scanner
,parser
иbinder
.) - Если мне нужно написать с нуля, есть ли какие-нибудь инструменты для TypeScript / JavaScript, которые могут мне в этом помочь (например, ANTLR или javacc для Java)?
- Есть ли какие-либо ресурсы о том, как реализовать компилятор на TypeScript / JavaScript, кроме самого компилятора TypeScript?