1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/kwpgit_admin-gaclib

Клонировать/Скачать
TODO_ParserGen.md 9.9 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 09:43 5dda1a5

Цель

  • Парсинг*

    • Нет необходимости указывать, разрешать двусмысленность или нет.
    • Вычисление неоднозначных случаев Parse, указание, какие AST должны поддерживать неоднозначность.
    • Полная мощность CFG, без ограничений.
      • Эксперимент: расширение всей леворекурсивной грамматики до праворекурсивной с инструкциями.
      • Эксперимент: опционально встраивать все правила, которые не генерируют функции парсера.
    • Генерация сообщений об ошибках.
    • Восстановление после ошибок.
  • Сериализация*

    • Экранирование и отмена экранирования пар (вместо только отмены экранирования).
    • Расчёт неоднозначных случаев ToString.
    • Создание алгоритма ToString.
  • AST*

    • Низкоуровневый AST с отражением.
    • Опциональное создание AST из пула.

Определение AST (совместимое с Workflow)

class CLASS_NAME [: BASE_CLASS]
{
  var FIELD_NAME : TYPE;
  ...
}

Конфигурации

  • Включить файлы в сгенерированный заголовок C++.
  • Зависимые файлы определения AST.
  • Посетители, выбранные для генерации.
  • Опциональная поддержка отражения.
    • Все конструкторы AST защищены.
    • Сгенерирован фабричный класс.
    • Если включён пул объектов AST, то:
      • отражение отключено;
      • для всех типов AST генерируются Ptr с перечисленными функциями Cast.
      • используются сгенерированные конструкции RTTI (например, тег enum class для типа).

Типы

  • Token: в предыдущей версии Token — это тип значения, теперь это ссылочный тип.
  • CLASS-NAME: другой класс.
  • TYPE[]: массив, элементу которого не разрешено быть другим массивом.

Прочее

  • Определить алгоритм ToString с настраиваемыми конфигурациями.

Лексический анализатор

  • Связать имя с регулярными выражениями.
  • Расширяемые токены.
    • Например, распознать R"[^\s(](* и вызвать функцию обратного вызова для определения конца строки.
  • Связать имя с подмножеством токенов и дать имя по умолчанию полному набору токенов.

Сообщения об ошибках

  • Генерировать сообщения об ошибках в коде C++.

Синтаксический анализатор

  • Приоритет циклов:
    • +[ RULE ] означает, что если RULE успешно выполняется, пропуск RULE не рассматривается, даже если остальная часть не анализируется.
    • -[ RULE ] означает, что только если пропуск RULE делает предложение неспособным к анализу, результат наличия RULE не отбрасывается.
    • [ RULE] означает сохранение обоих результатов.
    • +{ RULE }, -{ RULE }, {RULE} аналогичны, но { RULE } может генерировать более двух результатов, в то время как другие генерируют только один результат.
  • Возможность изменять подмножество токенов во время анализа.
  • Указание сообщения об ошибке при сбое определённого действия.
  • Генерация SAX-подобного парсера с обработчиком по умолчанию для создания AST.

Поддерживаемый EBNF

  • TOKEN [: PROPERTY-NAME]
  • RULE [: PROPERTY-NAME]
  • Необязательно:
    • +[ EBNF ]
    • -[ EBNF ]
    • [EBNF]
  • Цикл:
    • +{* EBNF }*
    • -{ EBNF }*
    • {EBNF}
  • with{ PROPERTY-ASSIGNMENT ... }

Программа EBNF

  • RULE {::= CLAUSE as CLASS-NAME} ;
    • Рассмотреть синтаксис здесь для переключения набора токенов.

Требования к алгоритму ToString

  • Каждый пункт должен создавать узел AST. EXP ::= '(' !EXP ')' не допускается, за исключением того, что этот пункт имеет только один узел.
  • Каждому узлу имени правила должно быть присвоено свойство. Узлы токенов необязательны, но эти свойства будут созданы автоматически.
  • Циклы не могут быть вложены в другой цикл. Это не ограничивает синтаксис, но ограничивает форму AST.

Структура проекта разработки

  • Исходный код ParserGen будет отделён от Vlpp.
  • AstGen:
    • Символы AST и генерация кода C++.
    • Генерация посетителей.
    • Создание простого построителя.
    • Отражение генерации.
    • Сериализация символов (это не отображается в окончательном ParserGen.exe).
  • Выполнение:
    • Сериализация инструкций, созданных парсером.
    • Выполнение инструкций в качестве SAX-подобного анализатора с уведомлением о неоднозначном узле, генерацией сообщений об ошибках и восстановлением после ошибок.
  • Компилятор: зависит от AstGen и Execution, берёт сгенерированный AST for ParserGen.
    • Берёт AST for ParserGen и генерирует инструкции.
    • Создаёт обработчик по умолчанию для создания AST для SAX-подобного анализатора.
    • Алгоритм ToString.
    • Двунаправленная привязка с текстом AST.
  • ParserGen: зависит от Компилятора, берёт созданный парсер и обработчик по умолчанию для создания AST. Для AST for ParserGen
  • Весь код интегрируется вместе.

UnitTestAst:

  • Модульное тестирование компонента AstGen и распределения пула и т. д.
  • Вручную написанные символы и генерация кода для AST for ParserGen, со всеми посетителями и простым конструктором.

UnitTestExecution:

  • Модульное тестирование Execution.
  • Утверждение непосредственно на SAX-подобном парсере.

UnitTestCompiler:

  • Модульное тестирование компилятора, на входе все тестовые случаи UnitTestExecution, переписанные с использованием сгенерированного простого конструктора для AST for ParserGen.
  • Утверждение на преобразованном в строку AST (совместно используется).
  • Один из тестовых случаев будет использовать синтаксис самого AST for ParserGen, с символами напрямую для AST, и сериализовать инструкции в файл C++, чтобы создать анализатор на C++ для анализа ввода ParserGen.

UnitTestParserGen:

  • Модульное тестирование ParserGen, на входе все тестовые случаи UnitTestExecution, переписанные в текстовом формате.
  • Утверждение на преобразованном в строку AST (совместно используется).
  • Генерация всех анализаторов в текстовом формате в код C++.

UnitTest:

  • Связать все файлы CPP во всех других модульных тестовых проектах, чтобы все тестовые примеры можно было запустить одним нажатием F5.
  • Протестировать все сгенерированные анализаторы в UnitTestParserGen.
  • Утвердить на преобразованном в строку AST (совместно используется).

Поскольку анализаторы написаны по-разному для разных модульных тестов, они хранятся отдельно от модульных тестов для совместного использования необходимых файлов. Не создавайте файл, если сгенерированный контент не изменился.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/kwpgit_admin-gaclib.git
git@api.gitlife.ru:oschina-mirror/kwpgit_admin-gaclib.git
oschina-mirror
kwpgit_admin-gaclib
kwpgit_admin-gaclib
master