#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.