Хочу сделать простенький язык с возможностью вставки кусочков 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 это выражается в том, что конструкция <script>console.log('</script>')</script>
Будет распознана, не так как мне хотелось бы
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'ом. Было бы здорово, если бы дали наводку куда копать, где почитать?
Советы приветствуются.