Расширение компилятора TypeScript для DSL

Прежде чем я начну: да мне действительно нужен (/ хочу) 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?

person superbadcodemonkey    schedule 09.03.2019    source источник
comment
Что касается вашего последнего вопроса, вики TypeScript предлагает несколько указателей: github.com/Microsoft/TypeScript/wiki/   -  person Karol Majewski    schedule 09.03.2019


Ответы (2)


Повозившись еще немного, я отказался от попыток расширить компилятор Typescript. В итоге я использовал chevrotain в качестве компилятора-генератора, и до сих пор он работал хорошо.

Основным недостатком этой библиотеки является то, что она (по моему опыту) не очень хорошо интегрируется с Typescript, потому что там много «волшебных» вещей, которые, очевидно, были разработаны для использования в высокодинамичной среде, которой является JavaScript (хотя библиотека сам написан в ТС).

В целом, у меня был довольно приятный опыт. Документация очень хорошая, возможностей много. Я очень рекомендую его всем, кто хочет создать DSL на Typescript.

person superbadcodemonkey    schedule 17.03.2019

Я думаю о том, чтобы отправиться в подобное путешествие, и могу порекомендовать Myna parser как достойный, TS-совместимый парсер для любого DSL, я уже использовал его однажды, чтобы создать собственный вариант уценки.

person sirtimbly    schedule 19.09.2019