2017-03-03 36 views
5

工作我想建立一个简单的项目,ANTLR的.NET核心使用VS2017 1.0项目。ANTLR的不与VS2017

正在关注https://github.com/sharwell/antlr4cs,向项目中添加了.g4文件。该项目文件看起来像这样,

<Project Sdk="Microsoft.NET.Sdk">  
    <PropertyGroup> 
    <TargetFramework>netcoreapp1.0</TargetFramework> </PropertyGroup> 

    <ItemGroup> 
    <None Remove="Calculator.g4" /> </ItemGroup> 

    <ItemGroup> 
    <PackageReference Include="Antlr4" Version="4.5.4-beta001" /> </ItemGroup> 

    <ItemGroup> 
    <AdditionalFiles Include="Calculator.g4" /> 
    </ItemGroup> 
</Project> 

但文件说,

根据上表中的MSBuild属性 列中找到现有的XML元素,或添加一个,如果它不存在。 例如,要为解析器生成分析树侦听器和访问者接口和基类,请将项目项目 更新为类似于以下内容。

<Antlr4 Include="CustomLanguage.g4"> 
<Generator>MSBuild:Compile</Generator> 
<CustomToolNamespace>MyProject.Folder</CustomToolNamespace> 
<Listener>True</Listener> <Visitor>True</Visitor> </Antlr4> 

没有在这个凸出文件中的任何Antlr4标签。 Antlr不支持VS2017? 是一个很好的例子,我可以遵循使用.net核心ANtlr吗?

+0

我只是测试4。在几种情况下6.1-beta001,它工作得很好。 –

+0

@LexLi VS2017? – Dhanuka777

+0

当然在VS2017 RTM。 –

回答

4

这只是我需要在我的.NET标准1.3类库项目来容纳语法文件。

<ItemGroup> 
    <Antlr4 Include="Something.g4"> 
     <Generator>MSBuild:Compile</Generator> 
     <Listener>False</Listener> 
     <Visitor>False</Visitor> 
    </Antlr4> 
    </ItemGroup> 
    <ItemGroup> 
    <PackageReference Include="Antlr4" Version="4.6.1-beta001" /> 
    </ItemGroup> 

注意,你可能会使用一个新的Antlr4包版本是唯一版本4.6.1创建这个答案的时候。

+0

刚刚落地于此,寻找(不存在的)文档。作为实验性功能,4.6.5-beta001是最新版本,它消除了对Java的依赖。您需要添加 True True

1

我只是在寻找同样的东西,对于.NET Core 2.0。

当前的ANTLR4软件包版本是4.6.5 Beta 1.在此版本中,C#生成器已移植到C#,因此对Java的依赖性被删除。这仍处于试验阶段,必须以手动启用:

<Antlr4UseCSharpGenerator>True</Antlr4UseCSharpGenerator> 

文件时.g4文件被修改也不会产生。它们将在调用dotnet build时生成。

文件匹配按预期工作,但更改设置如<Visitor>false</Visitor>需要在dotnet build之前调用dotnet clean

默认ANTLR的任务选项可以发现in the source

<Antlr4> 
    <Generator>MSBuild:Compile</Generator> 
    <CustomToolNamespace Condition="'$(Antlr4IsSdkProject)' != 'True'">$(RootNamespace)</CustomToolNamespace> 
    <CopyToOutputDirectory>Never</CopyToOutputDirectory> 
    <Encoding>UTF-8</Encoding> 
    <TargetLanguage>CSharp</TargetLanguage> 
    <Listener>true</Listener> 
    <Visitor>true</Visitor> 
    <Abstract>false</Abstract> 
    <ForceAtn>false</ForceAtn> 
</Antlr4> 

通配符的作品,所以如果我想建立所有g4文件,并禁止游客,我不得不写的是:

<ItemGroup> 
    <Antlr4 Include="**/*.g4" > 
    <Visitor>false</Visitor> 
    </Antlr4> 
</ItemGroup> 

我的整个csproj文件看起来像这样:

<Project Sdk="Microsoft.NET.Sdk"> 

    <PropertyGroup> 
    <TargetFramework>netstandard2.0</TargetFramework> 
    <Antlr4UseCSharpGenerator>True</Antlr4UseCSharpGenerator> 
    </PropertyGroup> 


    <ItemGroup> 
    <PackageReference Include="Antlr4"> 
     <Version>4.6.5-beta001</Version> 
    </PackageReference> 
    </ItemGroup> 

    <ItemGroup> 
     <Antlr4 Include="**/*.g4" > 
     <Visitor>false</Visitor> 
     </Antlr4> 
    </ItemGroup> 

</Project>