Конвертировать рукописный парсер в ANTLR

1

В настоящее время я работаю над языком программирования, и около 9 месяцев я использовал рукописный лексер и парсер. То, что я сейчас пытаюсь сделать, - это преобразовать это в ANTLR-парсер. Структура парсерной системы компилятора выглядит примерно так:

  1. Преобразуйте входной поток в дважды связанный список токенов (сделанный лексером).
  2. Установите какой-то помощник, который имеет переменную currentParser и может делать такие вещи, как reparse() или skip(n tokens)
  3. Начните разбор с определенным подклассом Parser (с помощью метода parse(ParserManager pm, Token token))
  4. В зависимости от текущего токена текущий синтаксический анализатор может push new Parser к стекю Parser или выскочить из стека парсера, что означает, что следующий синтаксический анализатор в стеке проанализирует следующий токен.
  5. Весь компилятор создается на таких интерфейсах, как ITypeList, которые также передаются в виде одиночных аргументов анализаторам.

Один пример подкласса Parser - TypeParser

public TypeParser(ITyped typed) { ... }

Или TypeListParser:

public TypeListParser(ITypeList typeList) { ... }

Эта простая структура применяется для каждой реализации Parser. Есть ли способ использовать эти интерфейсы в ANTLR?

Теги:
parsing
antlr

1 ответ

1
Лучший ответ

Ваши описания выглядят как вариант шаблона комбинатора Parser.

Чтобы преобразовать такую конструкцию в ANTLR:

  • сопоставьте маркеры с токенами ANTLR. Это довольно легко, так как интерфейс ANTLR-Tokens и ваши жетоны похожи. Вероятно, их можно было обернуть или сопоставить.
  • сопоставьте каждый подкласс анализатора с правилом синтаксического анализа ANTLR (или несколькими правилами). Вам понадобятся действия и семантические предикаты в этом парсере, поскольку ваши парсеры не управляются только синтаксисом
  • ANTLR4 не создает AST, поэтому ваши узлы AST могут быть полностью переработаны, вам нужно только решить, как создать AST из грамматики:

    1. для создания АСТ как части грамматики (действий), это эффективно, но делает вашу грамматику в значительной степени зависимой от АСТ-классов и языка внедрения
    2. для создания АСТ во втором проходе с посетителем дерева синтаксического анализа это разграничивает парсинг и конструкцию АСТ, но создается промежуточное дерево разбора, которое стоит некоторое время.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню