当前位置: 首页 > 知识库问答 >
问题:

Antlr4 C#生成文件的目标和输出路径

南宫建白
2023-03-14

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

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

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

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

编辑:

在查看antlr兴趣列表后,我发现这个线程表明intellisense的问题可能是Resharpers错误。如果是这种情况,那么我的问题是如何在解决方案中同时使用Antlr4和Resharper?https://groups.google.com/forum/#!主题/antlr讨论/QSuJXphaBDg

共有3个答案

平山
2023-03-14

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

  1. 停止使用ReSharper

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

宋畅
2023-03-14

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

按照以下步骤操作Intellisense

  • 在Visual Studio中,转到工具-
  • 解决方案
  • 用于链接到生成文件的文件夹
  • 侦听器实现类
  • 这将使用符号链接(而不是直接复制)将生成的文件添加到实现项目中
  • 如果以后必须更改语法,则无需删除和重新添加解析器文件,这提供了额外的好处
仰钧
2023-03-14

我找到了Resharper的扩展:ReSharper。外部代码。

Antlr提示:在Resharper中添加obj\Debug-

这对我有用。

 类似资料:
  • 我正在使用openapi生成器Gradle插件从openapi模式生成模型文件。在构建中使用这些设置。gradle脚本一切似乎都正常: } 结果类在正确的包中生成: 问题就在这里——我不需要它们在我的源代码中,我只需要它们在编译阶段。我希望它们在构建目录中生成,以将它们与其他逻辑分开。但是,当我将outport-dir更改为"$build dDir/生成". toString()时,会发生这种情况

  • 主要内容:gcc -c指令我们知道,从 C、C++源代码生成可执行文件要经历 4 个过程,分别为预处理、编译、汇编和链接。 《 GCC -E选项:对源程序做预处理操作》一节以 demo.c 源文件为例,介绍了如何对源文件进行预处理,并生成相应的 demo.i 预处理文件;《 GCC -S选项:编译非汇编文件》一节介绍了如何对 demo.c 或者 demo.i 进行编译,并生成相应的 demo.s 汇编代码文件。 [root

  • 我正在使用OpenAPI生成器gradle插件和“jaxrs resteasy”生成器,我想知道是否有办法更改输出文件的名称。现在它正在生产ApiApi。java,ApiService。java,ApiException。java等。 有没有办法配置它,这样输出将是MyNameApi.java和MyNameApiService.java? 示例YAML:

  • 但是,它仍然溢出父文件夹中所有生成的文件。 附言。这应该无关紧要,但我的环境是macOS。

  • 我正在编写一个使用javafx FXML生成日志文件的程序。是否可以生成一组与仪器相关联的文本字段。示例:型号:Sn:Tg:Gas: 我需要收集每个仪器的信息,但有些地方有5个单位,有些只有1个。我正在寻找有字段生成从用户输入多少他们需要。这是我能做的吗?

  • 问题内容: 我正在编写有关gRPC 的教程。当我生成文件时,我在结构体中得到了某种类型。 这是我的文件: 这是文件中的结构。有人可以告诉我为什么我的三种类型吗?该结构不应该反映我在自己中定义的内容吗? 问题答案: Protobuf库使用这些类型来存储未知字段。解码原型时,序列化数据中可能会有其他字段,库不知道该如何处理。例如,当数据的读取器和写入器使用原始文件的不同副本时,可能会发生这种情况。此功