Как лучше всего написать парсер javascript-based языка? Хочу сделать простенький язык с возможностью вставки кусочков js. (Аля jsx)
Как лучше всего это сделать? Как вообще интегрируют разные языки друг в друга. Например html -> js, jsx -> js, php -> html etc.?
Отмечу, что AST от JavaScript'a мне не нужно, мне нужно определить участки с ним. Т.е. выхлоп может быть таким примерно:node
- type='block'
- children [
node
- type="js"
- text="return foo"
...
Вижу следующие пути:
1) можно как-то пытаться решить проблему без парсинга самого js, но это ведет к проблемам.Проблемы
В случае html это выражается в том, что конструкция console.log('')
Будет распознана, не так как мне хотелось бы
2) использование парсеров с конфигурируемой грамматикой:
Например Yacc, jison, chevrotain - этот вариант мне очень нравится, но мне не хочется "велосипедить" парсинг самого js, более того хочется иметь его грамматику из внешних источников + постоянно обновляемую. Если у вас есть на примете, например, поддерживаемый репозиторий с es6+ грамматикой - было бы очень здорово.
3) использовать парсеры заточенные на js: acorn,esprima, или возможно вы предложите делать это через плагины babel'я например. Если у вас есть на примете статьи / проекты описывающие построение надмножества js этим путем - буду благодарен. В этом случае из коробки идет очень хорошая поддержка языка (и его еще не полностью поддерживаемых фич), чего так не хватает во 2-м варианте;
3.5) предполагаю, что можно научить какой-либо из парсеров парсить строку, пока он может, и когда он не может считать ничего дальше - считать это концом js-сниппета. Насколько это правильный подход. Причем желательно остановиться на токенизации (т.к. js ast как я говорил мне не нужно)
4) Не парсить js полностью, а только разбить его на "опасные" токены (строки, регулярные выражения, комменты) - участки кода, где может оказаться "закрывающий тег/скобка" - этот вариант честно говоря мне не нравится, но если есть очень дешевое решение в этом ключе - буду рад ссылке.
Резюмируя:
1) не знаете ли вы, где найти грамматику (es6, в идеале с живим комьюнити) js, которую можно расширить и скормить "живому" (не заброшенному) парсеру?
2) есть ли опыт / статья в закладках как это можно сделать иначе?
3) возможно можно интегрировать парсер со свободной грамматикой (jison например) с например acorn'ом. Было бы здорово, если бы дали наводку куда копать, где почитать?
Советы приветствуются.

21 Авг 2019 в 06:23
212 +1
0
Ответы
1

Есть несколько способов интеграции различных языков друг в друга, и выбор конкретного зависит от ваших целей и требований проекта.

1) Один из путей - использование плагинов Babel. Babel - это инструмент трансформации JavaScript кода. Он позволяет создавать собственные плагины, которые могут парсить и трансформировать различные части кода. Вы можете создать плагин, который будет распознавать и обрабатывать ваши блоки с JavaScript кодом в вашем языке.

2) Другой вариант - использование парсеров JavaScript, таких как Acorn или Esprima, для разбора JavaScript кода в ваших блоках. Вы можете использовать эти парсеры для определения границ JavaScript блоков и их содержимого.

3) Вы также можете рассмотреть возможность создания собственного парсера с конфигурируемой грамматикой, используя инструменты типа Jison. Вы можете определить грамматику и правила для вашего языка, включая вставки JavaScript кода, и использовать Jison для создания парсера для вашего языка.

4) Что касается поиска грамматики ES6 с активным сообществом, рекомендуется обратить внимание на спецификации ECMAScript и ресурсы, такие как GitHub репозитории со спецификациями языка.

Наконец, по поводу варианта 3.5, парсинг JavaScript кода по токенам и остановка на определенных токенах может быть сложным и ненадежным подходом, так как это может привести к неправильному разбору кода. Лучше всего использовать комплексный подход с парсерами JavaScript и инструментами трансформации, чтобы обрабатывать различные части вашего языка.

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

20 Апр в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 622 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир