我已经从github grammars-v4下载了Lexer和Parser .g4文件
在Visual Studio中,我用Antlr 4 4.6.6和Antlr4.Runtime.Standard 4.13.1包启动了一个新的类库项目
当我构建类库时,我看到以下错误
mismatched input 'options {' expecting COLON while matching a lexer rule PostgresSqlClasses ...\PostgreSQLLexer.g4 1421
mismatched input '=' expecting COLON while matching a rule PostgresSqlClasses ...\PostgreSQLLexer.g4 1422
mismatched input ';' expecting COLON while matching a rule PostgresSqlClasses ...\PostgreSQLLexer.g4 1422
mismatched input 'options {' expecting COLON while matching a lexer rule PostgresSqlClasses ...\PostgreSQLLexer.g4 1616
字符串
和
mismatched character '<EOF>' expecting ']' PostgresSqlClasses ...\antlr4.codegenerator\4.6.6\build\Antlr4.CodeGenerator.targets 132
型
我可以看到语法文件最近已经更新了。是我遗漏了什么还是那些.g4文件出错了?
-- Bart Kiers在下面的回答表明,这不是语法文件的错误,而是与我的Visual Studio 2022或Java设置有关。
--确认了下面巴特慷慨帮助后的语法没有问题。
我现在遵循Kaby 76的建议,使用Antlr 4 BuildTasks方法。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<None Remove="PostgreSQLLexer.g4" />
<None Remove="PostgreSQLParser.g4" />
</ItemGroup>
<ItemGroup>
<Antlr4 Include="PostgreSQLLexer.g4">
<Package>AntlrPostgresClasses</Package>
<AntOutDir>GeneratedOutput</AntOutDir>
</Antlr4>
<Antlr4 Include="PostgreSQLParser.g4">
<Package>AntlrPostgresClasses</Package>
<AntOutDir>GeneratedOutput</AntOutDir>
</Antlr4>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Antlr4.Runtime.Standard" Version="4.13.1" />
<PackageReference Include="Antlr4BuildTasks" Version="12.7.0" PrivateAssets="All" />
</ItemGroup>
</Project>
型
我可以看到正在生成一些(但不是全部).cs单元-现在我看到错误
CS 0246找不到类型或命名空间名称“PostgreSQLLexerBase”(是否缺少using指令或程序集引用?)AntlrPostgresClasses C:\Repos\PostgresParsers\AntlrPostgresClasses\GeneratedOutput\PostgreSQLLexer.cs 35
和
CS 0246找不到类型或命名空间名称“PostgreSQLParserBase”(是否缺少using指令或程序集引用?)AntlrPostgresClasses C:\Repos\PostgresParsers\AntlrPostgresClasses\GeneratedOutput\PostgreSQLParser.cs 38
the error occurs within the newlygenerated units
型
在kaby 76的建议下,我添加了4个文件,找到了here,现在类库构建完成了。
奇怪的是,它第一次没有建成,但它现在似乎很高兴。
2条答案
按热度按时间dgtucam11#
这一次似乎很好地纠正了在使用grammars-v4语法、Antlr 4工具和C#运行时时时的误解。
postgresql语法没有被破坏。但是,您应该使用大于或等于4.10的Antlr版本。postgresql语法需要版本4.10或更新版本,如desc.xml文件中所声明的。该语法使用在Antlr 4.10中添加的caseInsensitive选项。其他语法使用更新的功能。并且,虽然此语法具有a Go language port,语法并不真正与Go目标一起工作(可能它太慢了)。出于这些原因,阅读the desc.xml file是一个好主意。
你不应该使用Sam的Antlr 4cs fork,不仅因为它不能真正使用这种语法,还因为它太旧了。如果你的.csproj包含任何
<PackageReference>
到任何这些包,你可以告诉你是否正在使用这个fork:Antlr 4cs分支的开发在几年前就停止了。使用
<PackageReference Include="antlr4.Runtime.Standard" />
代替<PackageReference Include="Antlr4.Runtime"/>
。Antlr4.Runtime.Standard是从the official Antlr4 source runtime构建的包。你真的应该避免使用包含Antlr4.Runtime.Standard和任何旧Antlr 4cs包的引用的.csproj。使用其中一个,但最好是Antlr4.Runtime.Standard。您可以编写驱动程序、下载Java、下载Antlr4.jar等,或者使用Trash使用Wiki中概述的过程进行测试。
由于您已经安装了dotnet,因此您可能只需要安装一些dotnet工具即可生成C#驱动程序。
字符串
然后,您可以在C#中生成和测试解析器。
型
您可以使用命令行来构建、编译和运行解析器,也可以在VSCode或VS 2022中打开生成的Test.csproj文件,然后只需按“F5”从头开始构建解析器,从输入窗口编译、链接和运行解析器。
即使你想从头开始编写驱动程序,我也会建议你使用一个nuget包来自动管理程序的构建依赖关系。你不想养成下载Antlr工具.jar、下载并安装Java、手动运行
java -jar antlr-4.13.1-complete.jar ...
的习惯,等等。你应该使用Antlr4BuildTasks。它是Antlr4 Nuget package的直接替代品。该软件包包含自动下载Java运行时环境的所有逻辑,从Antlr工具生成解析器源代码,编译和链接。你可以直接在VSCode,VS 2022中构建,或者使用dotnet或msbuild从命令行Cmd/Cygwin/Powershell/etc中构建。Antlr 4 BuildTasks是从Antlr4cs code派生的,并进行了更新。它包含了许多bug修复和对旧Antlr 4cs包的改进。目前没有好的扩展VS 2022为Antlr 4 grammars. https://marketplace.visualstudio.com/search?term=antlr&target=VS&category=All%20categories&vsVersion=&sortBy=Relevance.你最好的选择是使用VSCode和Mike's excellent extension for Antlr.或者,你可以使用Rider与Antlr4 extension.通常,我使用VS 2022和使用Mads' "Open in VSCode",如果我需要有一个扩展,是Antlr 4知道.
cbeh67ev2#
没有任何代码生成器/构建工具,我没有任何问题。
我下载了以下内容:
https://raw.githubusercontent.com/antlr/grammars-v4/master/sql/postgresql/PostgreSQLParser.g4
个https://raw.githubusercontent.com/antlr/grammars-v4/master/sql/postgresql/CSharp/LexerDispatchingErrorListener.cs
个https://raw.githubusercontent.com/antlr/grammars-v4/master/sql/postgresql/CSharp/ParserDispatchingErrorListener.cs
个https://raw.githubusercontent.com/antlr/grammars-v4/master/sql/postgresql/CSharp/PostgreSQLLexerBase.cs
个https://raw.githubusercontent.com/antlr/grammars-v4/master/sql/postgresql/CSharp/PostgreSQLParserBase.cs
个并将这些类放在名称空间
TestAntlr
中。然后我做了以下操作:字符串
然后我就跑:
型
不会有问题。