ANTLR4 PostgreSQL语法被破坏了吗?

xvw2m8pv  于 9个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(197)

我已经从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,现在类库构建完成了。
奇怪的是,它第一次没有建成,但它现在似乎很高兴。

dgtucam1

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#驱动程序。

dotnet tool install -g trgen
dotnet tool install -g trglob
dotnet tool install -g triconv
dotnet tool install -g trparse
dotnet tool install -g trxml

字符串
然后,您可以在C#中生成和测试解析器。

git clone https://github.com/antlr/grammars-v4.git
cd grammars-v4/sql/postgresql
trgen -t CSharp
cd Generated-CSharp/
dotnet build Test.csproj
./bin/Debug/net7.0/Test.exe ../examples/aggregates.sql
./bin/Debug/net7.0/Test.exe ../examples/aggregates.sql -tree


您可以使用命令行来构建、编译和运行解析器,也可以在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.或者,你可以使用RiderAntlr4 extension.通常,我使用VS 2022和使用Mads' "Open in VSCode",如果我需要有一个扩展,是Antlr 4知道.

cbeh67ev

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中。然后我做了以下操作:

java -jar antlr-4.13.1-complete.jar -Dlanguage=CSharp -package TestAntlr *.g4

字符串
然后我就跑:

// <PackageReference Include="Antlr4.Runtime.Standard" Version="4.13.1" />
var lexer = new PostgreSQLLexer(CharStreams.fromString("SELECT something FROM somewhere"));
var parser = new PostgreSQLParser(new CommonTokenStream(lexer));

Console.WriteLine(parser.root().ToStringTree(recog: parser));


不会有问题。

相关问题