c# - ANTLR4 与 Unity3D

标签 c# unity3d antlr4

我目前正在尝试使用我的 ANTLR4 Unity 项目中的解析器/词法分析器。 我采取的步骤是:

  • 从单独项目中的语法生成解析器和词法分析器,并将词法分析器、解析器和访问者/监听器复制到 Unity 项目中
  • 由于显然缺少 Antlr4 运行时,我添加了 Antlr4.Runtime.v3.5.dll,因为 Unity 使用 .NET 3.5
  • 我修复了解析器中的一个错误,因为无法解析 IReadOnlyList。我只是把它改成一个 IList

完成所有这些步骤后,Unity 向我显示以下错误:

-----CompilerOutput:-stdout--exitcode: 
-1073741819--compilationhadfailure: True
--outfile: Temp/Assembly-CSharp.dll

compute_class_bitmap: Invalid type 13 for field 
Antlr4.Runtime.Recognizer`2[Symbol,ATNInterpreter]:_interp

谁能帮我解决这个问题?启动并运行这个解析器非常重要,否则我需要自己编写解析器,这会非常烦人...

最佳答案

确保您使用的是 ANTLR 的 C# 运行时,它可以在 github 上找到:

https://github.com/tunnelvisionlabs/antlr4cs

该链接中的自述文件包含大量有关安装运行时的信息。在为您提供分步列表时,我会多次引用此自述文件。

我假设您使用的是 Windows。您目前无法使用 Mac 为 C# 编译 ANTLR4 解析器。

1) 安装 Visual Studio Community(如果您尚未安装)并在安装时确保安装:

  • 核心 Visual Studio 编辑器(默认)
  • .NET 桌面开发(在工作负载下)
  • NuGet 包管理器(在单个组件下 -> 代码工具)

2) 创建一个新项目。

  • 选择 Windows 经典桌面
  • 选择 .NET Framework 应用
  • 创建项目后,右键单击项目名称并选择“属性”并记下您的 .NET Framework 版本(我的是 4.6.1)

3) 使用 NuGet 安装 ANTLR4。安装最新的稳定版 ANTLR4(我的是 4.6.4)

  • 右键单击“解决方案资源管理器”窗口中的顶级解决方案节点,然后选择“管理解决方案的 NuGet 包...”
  • 选择浏览并在搜索框中键入 Antlr4
  • 在搜索结果中会有几个选项。点击名字刚好是Antlr4的
  • 在右侧 Pane 中,选择最新的稳定版本 (4.6.4),然后单击安装

4) 通过单击项目 -> 添加现有项... 并导航到您的 .g4 文件,将您的语法文件 (.g4) 添加到您的项目。

5) 来自上面发布的链接中的 github 自述文件:

如果您安装了 ANTLR 语言支持扩展,则会自动执行此步骤。否则,您需要在解决方案资源管理器中右键单击语法文件并选择属性。在属性窗口中,配置以下项目。

  • 构建操作:Antlr4(如果 Antlr4 未作为选项出现在下拉列表中,请重新启动 Visual Studio,然后重试)
  • 自定义工具:MSBuild:Compile
  • 自定义工具命名空间:您希望生成的类位于其中的命名空间的完整名称

6) 重新启动 Visual Studio 并重新加载项目

7) 选择构建 -> 构建解决方案

8) 在 ~/repos/projectName/projectName/obj/Debug 中查找生成的文件

  • 将 *.tokens 和 *.cs 复制到一个新文件夹
  • 同时将 repos/projectName/projectName/Properties/AssemblyInfo.cs 复制到该新文件夹
  • 打开 AssemblyInfo.cs 并添加行“using System;”在顶部和底部的行“[assembly: CLSCompliant(false)]”

9) 移动到 Unity 并导入您在上一步中创建的文件夹。

10) 打开你安装Antlr4的目录,找到子目录Antlr4.Runtime.4.6.4/lib(你可能需要把4.6.4替换成你的ANTLR4版本)然后选择对应的文件夹步骤 2 中使用的 .NET 版本(在我的例子中,最接近的版本是 net4.5)。将 Antlr4.Runtime.dll 从该子目录拖到您的 Unity 项目中。

您应该可以在 Unity 中使用 ANTLR4。

关于c# - ANTLR4 与 Unity3D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22375476/

相关文章:

antlr - ANTLR 中的 'semantic predicate' 是什么?

c# - WPF 用户控件项未显示

c# - 如何在C#Unity中解决此问题

java - ANTLR V4 + Java8 语法 -> OutOfMemoryException

unity3d - unity : VRDevice cardboard not supported in Editor Mode. 请在目标设备上运行

c# - 使用 C# 的 Google 语音识别 REST API 的错误请求错误

java - ANTLR 4 在触发监听器事件之前提前处理错误和异常

c# - 使用 IEnumerable 和多重继承时出现 BadImageFormatException

c# - 填: SelectCommand. 连接属性还没有初始化

c# - Microsoft Help Viewer 可以作为一个独立的应用程序使用吗?