Как лучше всего написать парсер 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'ом. Было бы здорово, если бы дали наводку куда копать, где почитать? Советы приветствуются.
Есть несколько способов интеграции различных языков друг в друга, и выбор конкретного зависит от ваших целей и требований проекта.
1) Один из путей - использование плагинов Babel. Babel - это инструмент трансформации JavaScript кода. Он позволяет создавать собственные плагины, которые могут парсить и трансформировать различные части кода. Вы можете создать плагин, который будет распознавать и обрабатывать ваши блоки с JavaScript кодом в вашем языке.
2) Другой вариант - использование парсеров JavaScript, таких как Acorn или Esprima, для разбора JavaScript кода в ваших блоках. Вы можете использовать эти парсеры для определения границ JavaScript блоков и их содержимого.
3) Вы также можете рассмотреть возможность создания собственного парсера с конфигурируемой грамматикой, используя инструменты типа Jison. Вы можете определить грамматику и правила для вашего языка, включая вставки JavaScript кода, и использовать Jison для создания парсера для вашего языка.
4) Что касается поиска грамматики ES6 с активным сообществом, рекомендуется обратить внимание на спецификации ECMAScript и ресурсы, такие как GitHub репозитории со спецификациями языка.
Наконец, по поводу варианта 3.5, парсинг JavaScript кода по токенам и остановка на определенных токенах может быть сложным и ненадежным подходом, так как это может привести к неправильному разбору кода. Лучше всего использовать комплексный подход с парсерами JavaScript и инструментами трансформации, чтобы обрабатывать различные части вашего языка.
В целом, выбор подхода зависит от специфики вашего проекта и ваших целей. Может быть полезно изучить различные подходы и рассмотреть, как они могут быть применены к вашему конкретному случаю.
Есть несколько способов интеграции различных языков друг в друга, и выбор конкретного зависит от ваших целей и требований проекта.
1) Один из путей - использование плагинов Babel. Babel - это инструмент трансформации JavaScript кода. Он позволяет создавать собственные плагины, которые могут парсить и трансформировать различные части кода. Вы можете создать плагин, который будет распознавать и обрабатывать ваши блоки с JavaScript кодом в вашем языке.
2) Другой вариант - использование парсеров JavaScript, таких как Acorn или Esprima, для разбора JavaScript кода в ваших блоках. Вы можете использовать эти парсеры для определения границ JavaScript блоков и их содержимого.
3) Вы также можете рассмотреть возможность создания собственного парсера с конфигурируемой грамматикой, используя инструменты типа Jison. Вы можете определить грамматику и правила для вашего языка, включая вставки JavaScript кода, и использовать Jison для создания парсера для вашего языка.
4) Что касается поиска грамматики ES6 с активным сообществом, рекомендуется обратить внимание на спецификации ECMAScript и ресурсы, такие как GitHub репозитории со спецификациями языка.
Наконец, по поводу варианта 3.5, парсинг JavaScript кода по токенам и остановка на определенных токенах может быть сложным и ненадежным подходом, так как это может привести к неправильному разбору кода. Лучше всего использовать комплексный подход с парсерами JavaScript и инструментами трансформации, чтобы обрабатывать различные части вашего языка.
В целом, выбор подхода зависит от специфики вашего проекта и ваших целей. Может быть полезно изучить различные подходы и рассмотреть, как они могут быть применены к вашему конкретному случаю.