Antlr无法使用VS2017

时间:2017-03-03 00:17:41

标签: c# .net-core antlr4 visual-studio-2017

我正在尝试使用 VS2017 .net core 1.0 项目中使用 Antlr 设置一个简单项目。

关注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>

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

2 个答案:

答案 0 :(得分:4)

这就是我在.NET Standard 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是创建此答案时唯一可用的版本。

答案 1 :(得分:3)

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

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

melt

修改<Antlr4UseCSharpGenerator>True</Antlr4UseCSharpGenerator> 文件时,不会生成文件。它们将在调用.g4时生成。

文件通配符按预期工作但是更改dotnet build之类的设置需要在<Visitor>false</Visitor>之前调用dotnet clean

可以找到默认的Antlr任务选项in the source

dotnet build

Globbing工作,所以如果我想构建所有<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