Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用MySQL ANTLR4语法,得到;类型或命名空间名称';MySQLBaseLexer';“找不到”;_C#_Mysql_Parsing_Antlr4_Grammar - Fatal编程技术网

C# 在C中使用MySQL ANTLR4语法,得到;类型或命名空间名称';MySQLBaseLexer';“找不到”;

C# 在C中使用MySQL ANTLR4语法,得到;类型或命名空间名称';MySQLBaseLexer';“找不到”;,c#,mysql,parsing,antlr4,grammar,C#,Mysql,Parsing,Antlr4,Grammar,我正在尝试使用MySQL的ANTLR4语法来进行一些基本的语句解析。这是我第一次使用ANTLR。我在VS2017中创建了一个空白的C#console项目,安装了ANTLR4、ANTLR4.CodeGenerator和ANTLR4.Runtime nuget包以及ANTLR语言支持扩展。我添加了MySQLLexer.g4、MySQLParser.g4和预定义的.tokens文件。当我尝试构建解决方案时,出现以下错误: 找不到类型或命名空间名称“MySQLBaseLexer”(是否缺少using指令

我正在尝试使用MySQL的ANTLR4语法来进行一些基本的语句解析。这是我第一次使用ANTLR。我在VS2017中创建了一个空白的C#console项目,安装了ANTLR4、ANTLR4.CodeGenerator和ANTLR4.Runtime nuget包以及ANTLR语言支持扩展。我添加了MySQLLexer.g4、MySQLParser.g4和预定义的.tokens文件。当我尝试构建解决方案时,出现以下错误:

找不到类型或命名空间名称“MySQLBaseLexer”(是否缺少using指令或程序集引用?

我一直在浏览教程,SO和其他讨论在C#上使用ANTLR4的博客,但似乎没有任何东西可以解决错误。有人能给我指出正确的方向来让它正常工作吗


谢谢!

我假设你使用的是两个语法文件。虽然这些语法可能不包含C++代码,但是它需要你提到的基类是C++代码,所以你需要将代码< MySqLasBelelExel.CPP< /C>和辅助代码导入到Git RePO中找到的C语言中。 另外,为什么不尝试使用Visual Studio 2019,这是官方的Java Antlr工具4.7.2(需要Java),以及我的用于生成Antlr C#程序的Net Core模板?所有内容都集成到一个构建中并运行F5。请检查并运行。C#工具至少比Antlr的正式发布晚了两年。此外,*.tokens是一个生成的文件


我不明白为什么人们一直在将Antlr生成的文件签入到repo中。不应该签入并使用它,尤其是在使用我的模板时。g4文件是您的源文件。如果您需要在VS中编辑Antlr语法的扩展名,您可能想签出我的AntlrVSIX扩展名。

一看到t,我就对这个主题感兴趣他的主题,但最近去度假了,我可以完成样本

以下是一个示例:

我在其中创建了workbench()提供的语法,并对其进行了修改,以在.NET Core上工作(使用.NET标准实现可移植性)

我创建了这个示例项目,它不是用于生产的,我也不是ANTLR专家,但我喜欢编码和解析器。


看看README.md,它可能是你的引导程序。如果我有机会写一篇博客文章,我会在这里分享这些笔记。

谢谢你的回复@kaby76!我使用VS2019、.NET核心模板和Java Antlr工具4.7.2尝试了你的建议。我已经安装了Java,并使用页面上的说明和获得了预期的输出。但是,当我使用模板创建新项目时,它仍然为我提供相同的“类型”或命名空间,但找不到“。它指定了一个不同的命名空间,因为它引用的是ArtihmeticLexer和ArtihmeticParser类。我验证了我的版本也都匹配。对我的错误有什么建议吗?谢谢……在您的新项目中,右键单击解决方案管理器中的.g4文件,然后打开属性。确保将“生成操作”设置为。”“ANTLR 4语法”。此外,将“自定义工具名称空间”设置为您在项目中使用的名称空间(即,ANTLR工具将在您给定的名称空间中生成解析器)。然后,尝试清理,然后重新生成。有充分的理由将生成的解析器/词法分析器文件保留在repo中:1)特别是对于非Java语言,这使得构建应用程序更简单(不需要Java),2)您可以更好地跟踪由语法更改导致的生成文件中的更改。我有足够的理由将这些文件保留在工作台repo中。在检查并更正“自定义工具名称空间”之后“它消除了一系列错误,但仍有一个错误<代码>'CommonTokenStream'不包含'OutputTokens'的定义,而最佳扩展方法重载'Output.OutputTokens(IList)'需要'IList'类型的接收器。关于如何解决该问题的任何想法?您可以从解析器生成的.cs/.tokens文件中保存,但使用Antlr4BuildTasks,这些文件被输出到obj/目录,就像.obj一样。很可能Harwell的C#代码生成器也有同样的功能——我从他的代码中派生了Antlr4BuildTasks,并用Java Antlr工具调用替换了C#代码生成器。保存这些文件将解耦对Java.exe的构建依赖关系,但随后应删除对Antlr4BuildTasks的依赖关系,以避免在程序中编译两个版本的解析器。对于输出,请确保传递CommonTokeStream,而不是AntlInputStream.Nice。仅供参考,您在自述文件中提到的由Antlr生成的错误方法名称是Antlr版本4.7.1中的一个错误。这在ANTLR4.7.2中已经修复,但最新版本现在是4.8。在.csproj文件中使用的rule和build-parsers.cmd文件通常是通过带有。该工具适用于Net Core、Framework和“信不信由你”的VC++项目——这可不是一件容易的事。@kaby感谢你的见解。我更新了Antlr,一切都按照你所说的进行了。此时,我将保留自定义msbuild任务,但当然可以将其替换为Antlr4BuildTasks。