Совместное использование грамматики ANTLR среди несвязанных проектов - PullRequest
2 голосов
/ 23 сентября 2019

Я ищу способ управления зависимостями между грамматиками в нескольких системах .NET.

У меня есть несколько библиотек .NET, которые используют языки для конкретных приложений:

  • Библиотека для вычисления выражений, указанных во время выполнения,
  • Библиотека для выполнения запросов к базе данных приложения,
  • Библиотека для выполнения нескольких взаимозависимых вычислений,
  • Aнесколько других проектов с их собственными небольшими языками

Вот диаграмма, показывающая зависимости между моими библиотеками и их комбинациями лексера / парсера:

Parser Dependency

Стрелки показывают зависимости между различными частями моей системы:

  1. Зависимости между библиотекой и ее грамматикой,
  2. Зависимости между модулями .NET, представленные в нашей системе сборки (MSBuild) и
  3. Зависимости на уровне источника между грамматиками с помощью директивы import в файле грамматики.

Зависимости первыхt и второй вид (показанный синими стрелками) отлично управляются системой сборки и не вызывают у нас никаких проблем.Однако зависимости третьего типа (красные стрелки) требуют, чтобы исходный код грамматики выражения был доступен при компиляции грамматики запроса.Этот тип зависимости напрямую не поддерживается системой сборки, и это останавливает попытку модульной системы.

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

Я ищу решение, которое позволяет системе сборки управлять этой исходной зависимостью или полностью ее устраняет.

1 Ответ

0 голосов
/ 24 сентября 2019

Вы можете поместить все грамматики в отдельный проект (например, библиотеку "парсеров"), который предоставляет базовые функции синтаксического анализа для других библиотек / движков:

(ExpressionParser, QueryParser, ComputingEngineParser) <--- [Parsers.DLL]

[Parsers.DLL] <--- [ExpressionLibrary.DLL]
              <--- [QueryLibrary.DLL]
              <--- [ComputingEngine.EXE]
...