Pegjs: Препроцессор? Восстановить исходный код

Созданный на 12 нояб. 2017  ·  5Комментарии  ·  Источник: pegjs/pegjs

Я создаю расширения к существующему языку в качестве препроцессора. Мне не удалось выяснить, есть ли способ заставить pegjs регенерировать исходный код. В основном я хочу, чтобы он анализировал источник, я хочу изменить AST, а затем регенерировать источник. В любом случае это возможно?

discussion question

Самый полезный комментарий

@YemSalat прав, PEG.js - это просто генератор парсеров.

  1. Создайте парсер с помощью PEG.js (убедитесь, что действия возвращают AST)
  2. Проанализируйте свой язык с помощью сгенерированного синтаксического анализатора, чтобы построить AST
  3. Измените AST с помощью проходов преобразования
  4. Восстановите исходный код

Как видите, PEG.js задействован только на первом этапе, поэтому, если вы хотите регенерировать исходный код, вам нужно создать компилятор самостоятельно, или если компилятор или генератор (инструментальная цепочка) уже существует для языка, я предлагаю вы либо возвращаете AST, совместимый с цепочкой инструментов, либо добавляете преобразование, которое изменяет AST, чтобы быть более совместимым с цепочкой инструментов.

В заключение, поскольку на самом деле это не проблема PEG.js, но добро пожаловать, чтобы продолжить обсуждение.

Все 5 Комментарий

@mattkanwisher, извините, я не совсем понимаю, что вы имеете в виду под "регенерировать" источник.
Не могли бы вы немного уточнить? Если вы имеете в виду создание кода на основе AST - вам придется написать эту логику самостоятельно, либо непосредственно в грамматике, либо как отдельный фрагмент.

Да, создать код на основе AST, поэтому мне нужно сгенерировать компилятор обратно в исходный код, если я хочу выполнить предварительную обработку с помощью этого?

Хм, если вам нужен _оригинальный_ источник - он все равно будет у вас без необходимости его сгенерировать, верно?
Но если вам нужна его модифицированная версия - вам придется самому написать логику генерации кода.
( @Mingun @futagoza поправьте меня, если я ошибаюсь)

@YemSalat прав, PEG.js - это просто генератор парсеров.

  1. Создайте парсер с помощью PEG.js (убедитесь, что действия возвращают AST)
  2. Проанализируйте свой язык с помощью сгенерированного синтаксического анализатора, чтобы построить AST
  3. Измените AST с помощью проходов преобразования
  4. Восстановите исходный код

Как видите, PEG.js задействован только на первом этапе, поэтому, если вы хотите регенерировать исходный код, вам нужно создать компилятор самостоятельно, или если компилятор или генератор (инструментальная цепочка) уже существует для языка, я предлагаю вы либо возвращаете AST, совместимый с цепочкой инструментов, либо добавляете преобразование, которое изменяет AST, чтобы быть более совместимым с цепочкой инструментов.

В заключение, поскольку на самом деле это не проблема PEG.js, но добро пожаловать, чтобы продолжить обсуждение.

Вот и разобрался. Для всех, кто попадет на этот пост об ошибке в будущем. Просто прочтите исходный код «Супер крошечного компилятора». После этого я смог использовать pegjs для создания препроцессора за несколько часов.

https://github.com/thejameskyle/the-super-tiny-compiler

Была ли эта страница полезной?
0 / 5 - 0 рейтинги