Как лучше всего написать парсер 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 это выражается в том, что конструкция <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'ом. Было бы здорово, если бы дали наводку куда копать, где почитать?

Советы приветствуются.
  • Вопрос задан
  • 761 просмотр
Пригласить эксперта
Ответы на вопрос 5
@potan
Функциональный программист
Использовать монодические/комбинаторные парсеры. Примеры обычно приводятся на Haskell, но использовать этот паттерн не сложно на почти любом языке - желательно наличие замыканий и сборки мусора, без них можно обойтись, но программировать приходится сложно.
Ответ написан
Комментировать
@SimAllll
Как вообще интегрируют разные языки друг в дргуа. Например html -> js

2 абсолютно отдельные библиотеки - одна для HTML, другая какой-нибудь JS-движок с обвязкой
в основном работает первая, а как находит элемент <script> - дергает вторую

в php - там вообще парсеру до фени что вокруг него, хоть html хоть brainfuck, он ищет только <?php <? ?> и т.д.
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
1. <script>console.log('</script>')</script>Такая конструкция и в браузере может (могла раньше?) вызвать проблемы. Впрочем, не особо сложно написать простенький анализатор, который определит, что эти штуки внутри кавычек.

3. jslint?
Ответ написан
zoonman
@zoonman
⋆⋆⋆⋆⋆
То, что вы ищете называется AST. acorn и esprima именно то, что вы ищете.
Есть еще https://developer.mozilla.org/en-US/docs/Mozilla/P...

Я рекомендую вам взять https://github.com/syntax-tree/hast и получить узлы с JavaScript, а их в свою очередь скармливать JS AST.
Ответ написан
Комментировать
@NonameProgrammer
Насколько я понял, нужно сделать свой язык, но под js? Если да, то можно попробовать сделать транслятор своего языка (синтаксис) и перевести в js. За основу возьмите любую реализацию js на ваш вкус и язык. И добавьте свои синтаксические конструкции или что там
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы