11

我有一个带有 Antlr3 语法文件的 C# 解决方案,我正在尝试升级到 Anltr4。事实证明,语法是最简单的部分(它变得更好,而且大小只有三分之一!)。生成解析器原来是棘手的部分。

在旧的解决方案中,我只是在语法文件更改时运行 AntlrWorks 来更新词法分析器和解析器 .cs 文件。词法分析器和解析器与语法直接包含在同一个项目中,因此解析器周围的框架可以直接使用它们。

对于 C# 的 Antlr4 目标,我注意到(至少在默认情况下)生成的 Parser C# 类的输出路径位于中间目录中,例如 obj\Debug。这意味着我不能直接在同一个项目中使用解析器。如果我希望生成的源在我的 sln 中可用,我应该更改输出路径吗?我不想在我的 sln 中使用它吗?

我尝试为解析器生成单独制作一个项目,即一个包含语法文件的项目。当使用 Antlr4 目标构建此项目时,可以从需要解析器类的项目中引用生成的程序集。但是,如果该项目包含在解决方案中,我仍然没有在 Visual Studio 中获得任何智能感知,因为它的智能感知基于已加载项目的源文件,因此它仍然不太可用。我可以让它正常工作的唯一方法是构建然后卸载解析器项目,并让其他项目将其作为程序集文件而不是项目引用。

编辑:

在查看 antlr-interest 列表后,我发现这个线程表明智能感知的问题可能是 Resharpers 故障。如果是这种情况,那么我的问题是如何在我的解决方案中继续使用 Antlr4 和 Resharper? https://groups.google.com/forum/#!topic/antlr-discussion/QSuJXphaBDg

4

3 回答 3

12

有一种简单的方法可以充分利用 Antlr 4 和 Visual Studio。您在拥有一个单独的语法项目和实施项目方面处于正确的轨道上,但是您缺少几个步骤。

按照以下步骤让 Intellisense 正常工作

  • 在 Visual Studio 中,转到工具 -> 扩展和更新并在在线部分搜索 Sam Harwell 的“ANTLR 语言支持”。
    • 这做了几件事:
      • 为组合语法添加模板。
      • 添加语法高亮
      • 为语法添加 MSBuild 目标以生成解析器。
  • 在您的解决方案中,设置您的项目结构,如下所示:
    • 解决方案
      • 语法项目
        • ANTLR 4 组合语法
      • 实施项目
        • 生成文件的链接文件夹
        • 监听器实现类
  • 编写和编译你的语法。
  • 在指向生成文件的链接的文件夹中,右键单击该文件夹,然后单击添加 -> 现有项目
  • 浏览到 Grammar Project\obj\Debug 并选择所有生成的解析器文件。
  • 下一步很重要。在添加按钮上有一个小的下拉箭头。单击下拉箭头,然后单击“添加为链接”。
    • 这将使用符号链接而不是直接复制将生成的文件添加到实现项目中。
    • 如果您以后必须更改语法,这会带来额外的好处,即不必删除和重新添加解析器文件。
  • Intellisense 现在应该适用于您生成的解析器类,您甚至不必禁用 ReSharper。
于 2014-04-26T15:04:32.663 回答
12

我找到了 Resharper 的扩展:ReSharper.ExternalCode

Antlr 提示:添加obj\DebugResharper -> 代码检查 -> 外部代码并重新加载解决方案。

它对我有用。

于 2014-03-15T20:50:30.753 回答
4

您遇到了 ReSharper 的一个已知错误。ANTLR 3 和 ANTLR 4 C# 构建集成是可靠的,并且使用 Microsoft 用于其他语言和代码生成任务的长期建立的模式。您的选择是:

  1. 停止使用 ReSharper
  2. 让 ReSharper 作者解决对此功能缺乏支持的问题,或者
  3. 修改 ANTLR 4 目标以解决 ReSharper 中的限制,这将在构建中引入其他问题,这些问题可能会或可能不会被您使用。

选项 1 无疑是最便宜的,并且最有可能为您的项目提供可靠的长期支持。

于 2013-10-27T20:29:59.867 回答