在不相关的项目之间共享 ANTLR 语法

Sharing ANTLR grammars among unrelated projects

我正在寻找一种方法来管理多个 .NET 系统中语法之间的依赖关系。

我有几个使用特定于应用程序的语言的 .NET 库:

这是一张图表,显示了我的库及其 lexer/parser 组合之间的依赖关系:

箭头显示我系统各个部分之间的依赖关系:

  1. 库与其语法之间的依赖关系,
  2. 呈现给我们的构建系统 (MSBuild) 的 .NET 模块之间的依赖关系,以及
  3. 通过语法文件中的 import 指令,语法之间的源代码级依赖关系。

第一类和第二类依赖(蓝色箭头所示)由构建系统完美管理,不会给我们造成任何问题。但是,第三种类型(红色箭头)的依赖性要求在编译查询语法时提供表达式语法的源代码。构建系统不直接支持这种依赖关系,它破坏了系统模块化的尝试。

我通过在构建时将表达式语法的源文件复制到共享位置来解决这个问题的技术细节,以便依赖库的构建可以从那里获取它。但是,逻辑仍然是错误的,因为复制会创建构建系统不知道的隐藏依赖项。

我正在寻找一个解决方案,让构建系统管理这个源代码依赖性,或者完全消除它。

您可以将所有语法放在一个单独的项目(例如 "parsers" 库)中,为其他语法提供基本解析功能 libs/engines:

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

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