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

#typescript #tsc

#typescript #tsc

Вопрос:

Прежде чем я начну: да, мне действительно нужен DSL (даже если это просто для опыта), нет другого формата, который выражал бы то, что я пытаюсь сделать, не очень подробным, типобезопасным способом.


Некоторая справочная информация, актуальный вопрос внизу


Я хочу создать DSL-компилятор для моего проекта (TypeScript), и поскольку язык имеет много общего с синтаксисом и концепциями самого TypeScript (я разработал его таким образом) Я подумал о повторном использовании частей компилятора TypeScript, чтобы избежать повторного изобретения колеса. Меня больше всего интересуют scanner , parser и binder . Другая семантика и исходящие части моего DLS настолько сильно отличаются от TypeScript, что я почти уверен, что будет эффективнее написать его с нуля.

Я нашел этот сайт, который объясняет, как на самом деле работает компилятор (хотя я почти уверен, что он немного устарел), и пока я могу все довольно хорошо понимать. Насколько я могу видеть, нет причин, по которым я должен изобретать велосипед, если я могу расширить компилятор TypeScript.

Первая часть — это, конечно, scanner . Я попытался просканировать файл на моем языке, чтобы посмотреть, что произойдет, оказывается, что все, о чем tsc не знает, классифицируется ( SyntaxKind ) как Identifier (что имеет смысл). Для реализации моего DLS мне пришлось бы добавить ключевые слова и типы синтаксиса в этот сканер, который будет отправлен в parser для построения AST. Конечно, мне также придется расширить parser , но сейчас это не моя забота.

Моим первым побуждением было просто клонировать TypeScript respository и добавить требуемую логику. Таким образом, я мог бы использовать тот же API, что и на вышеупомянутом сайте, но с добавленными ключевыми словами / синтаксисом / AST-узлами. Затем я бы написал семантические проверки и фактически выдал сгенерированный вывод с нуля, и все было бы хорошо.

К сожалению, это на самом деле не сработало (отсюда и этот вопрос). Первым препятствием был просто перегружен размером и структурой репозитория, я просто не знал, где мне следует искать. Я попытался создать небольшую программу, которая использовала локальный исходный код вместо встроенного, но это тоже не сработало (вероятно, из-за какого-то сложного конвейера, через который проходит tsc, прежде чем он находится в каком-либо пригодном для использования состоянии). Я нашел compiler.ts , parser.ts и т.д. Файлы, но без возможности использовать мою пользовательскую версию от них было мало толку. Я пытался скопировать только те файлы, которые, как я думал, мне понадобятся, в мой собственный проект, но это вызвало всевозможные ошибки ввода и отсутствующие функции, и я понятия не имею, как (и если) я должен их исправить. Что еще хуже: у некоторых файлов были фактические ошибки компиляции, когда я пытался скомпилировать их в моей собственной среде (расслабляющие tsconfig.json настройки не помогли).


Актуальный вопрос

У меня есть три вопроса:

  • Хорошая ли идея попробовать расширить те части компилятора TypeScript, которые полезны, или я должен просто писать с нуля? (Я в основном говорю о scanner , parser и binder компонентах.)
  • Если я должен просто писать с нуля, есть ли какие-либо инструменты для TypeScript / JavaScript, которые могут мне помочь в этом (например, ANTLR или javacc для Java)?
  • Есть ли какие-либо ресурсы о том, как реализовать компилятор в TypeScript / JavaScript, кроме самого компилятора TypeScript?

Комментарии:

1. Что касается вашего последнего вопроса, TypeScript wiki предлагает несколько советов: github.com/Microsoft/TypeScript/wiki /…

Ответ №1:

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

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

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

Ответ №2:

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