我从github grammars-v4下载了词法分析器和解析器.g4文件

在Visual Studio中,我使用包Antlr4 4.6.6和Antlr4.Runtime.St和ard 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 Kier下面的回答表明,这不是语法文件出错,而是与我的Visual Studio 2022或Java设置有关.

--确认了下面巴特慷慨帮助后的语法没有问题.

我现在正在遵循Kaby76的S的建议,使用Antlr4BuildTask法.

<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.St和ard" Version="4.13.1" />
    <PackageReference Include="Antlr4BuildTasks" Version="12.7.0" PrivateAssets="All" />
  </ItemGroup>

</Project>

我可以看到一些(但不是全部).cs单元正在生成-现在我看到了错误

CS0246类型或命名空间名称"PostgreSQLLexforBase"不能是 已找到(是否缺少Using指令或程序集 参考?)AntlrPostClors C:\Repos\PostgresParsers\AntlrPostgresClasses\GeneratedOutput\PostgreSQLLexer.cs 35

CS0246类型或命名空间名称"PostgreSQLParserBase"不能是 已找到(是否缺少Using指令或程序集 参考?)AntlrPostGresClasses C:\Repos\PostgresParsers\AntlrPostgresClasses\GeneratedOutput\PostgreSQLParser.cs 38

the error occurs within the newlygenerated units

On kaby76's advice I added the 4 files found here 和 the class library now builds.

奇怪的是,它第一次没有建成,但它现在似乎很高兴.

推荐答案

这一次似乎可以纠正使用grammars-v4个语法,Antlr4工具和C#运行时的误解.

postgresql的语法并没有被打破.但是,您应该使用大于或等于4.10的Antlr版本.The postgresql grammar requires version 4.10 or newer, as declared in the desc.xml file.语法使用在Antlr 4.10中添加的caseInsensitive option.其他语法使用更新的功能.而且,虽然这个语法有a Go language port个,但是这个语法并不能真正处理Go目标(可能太慢了).出于这些原因,仔细阅读the desc.xml file是一个好主意.

您不应该使用Sam‘s Antlr4cs Fork,不仅因为它不能真正使用这种语法,而且因为它太老了.如果您的.csproj包含以下包中的任何<PackageReference>个,则可以判断您是否正在使用此分支:

Antlr4csfork 的开发在几年前就停止了.使用<PackageReference Include="antlr4.Runtime.Standard" />.Antlr4.Runtime.Standard是从the official Antlr4 source runtime构建的包,而不是<PackageReference Include="Antlr4.Runtime"/>.您真的应该避免在.csproj中同时包含对Antlr4.Runtime.Standard和任何旧的Antlr4cs包的引用.使用一种或另一种,但最好是Antlr4.Runme.Standard.

您可以编写驱动程序、下载Java、下载Antlr4.jar等,也可以使用the WikiUSTrash中概述的过程进行测试.

因为您已经安装了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或VS2022中打开生成的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/等进行构建.Antlr 4 BuildTasks是从Antlr4cs code中派生出来的,并进行了更新.它包含了对旧Antlr 4cs包的许多错误修复和改进.

目前还没有针对Antlr4语法的VS2022的良好扩展.https://marketplace.visualstudio.com/search?term=antlr&target=VS&category=All%20categories&vsVersion=&sortBy=Relevance美元.你最好的 Select 是使用VSCode和Mike's excellent extension for Antlr.或者,您可以将RiderAntlr4 extension一起使用.通常,我使用VS2022,如果我需要一个支持Antlr4的扩展,则使用Mads' "Open in VSCode".

Postgresql相关问答推荐

Postgres:如何优化在多个表上搜索列的相似性查询?(Pg_Trgm)

复合索引列的顺序导致不同的计划

锁定模式与PostgreSQL中的另一种锁定模式冲突到底是什么意思?

是否可以短时间运行 VACUUM FULL 并获得一些好处?

Postgres内部如何计算月份间隔

有没有办法使用postgresql将具有不同ID的同一行多次添加到表中?

PostgreSQL unnest 与空数组

PostgreSQL 中基于时间戳的移动平均线

升级到 OSX Mavericks 后修复 postgresql

postgreSQL 将列数据类型更改为没有时区的时间戳

如何查询存储在数组中的 Rails ActiveRecord 数据

为什么 sqlalchemy 的默认列值不起作用

我如何知道我的 PostgreSQL 服务器是否使用C语言环境?

错误:must be owner of language plpgsql

在不存在的行上有select for update块

安装时 postgres 的默认用户

PostgreSQL 条件 where 子句

Array Push的 Postgres 数组追加和数组长度

如何在不丢失openproject数据的情况下将postgresql数据库从10升级到12

PostgreSQL - 如何在不同时区呈现日期?