我有一个ANTLR语法文件作为C#项目文件的一部分,并遵循User Manual中列出的步骤。
<Project ...>
<PropertyGroup>
<Antlr3ToolPath>$(ProjectDir)tools\antlr-3.1.3\lib</Antlr3ToolPath>
<AntlrCleanupPath>$(ProjectDir)AntlrCleanup\$(OutputPath)</AntlrCleanupPath>
</PropertyGroup>
<ItemGroup>
<Antlr3 Include="Grammar\Foo.g">
<OutputFiles>FooLexer.cs;FooParser.cs</OutputFiles>
</Antlr3>
<Antlr3 Include="Grammar\Bar.g">
<OutputFiles>BarLexer.cs;BarParser.cs</OutputFiles>
</Antlr3>
</ItemGroup>
<Target Name="GenerateAntlrCode"
Inputs="@(Antlr3)"
Outputs="%(Antlr3.OutputFiles)">
<Exec Command="java -cp %22$(Antlr3ToolPath)\antlr-3.1.3.jar%22 org.antlr.Tool -message-format vs2005 @(Antlr3Input)" Outputs="%(Antlr3Input.OutputFiles)" />
<Exec Command="%22$(AntlrCleanupPath)\AntlrCleanup.exe%22 @(Antlr3Input) %(Antlr3Input.OutputFiles)" />
</Target>
<ItemGroup>
<!-- ...other files here... -->
<Compile Include="Grammar\FooLexer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Foo.g</DependentUpon>
</Compile>
<Compile Include="Grammar\FooParser.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Foo.g</DependentUpon>
</Compile>
<!-- ... -->
</ItemGroup>
</Project>
无论出于何种原因,Compile
步骤仅使用旧版本的代码,似乎没有任何调整可以提供帮助。
“旧版本”,我的意思是如果我清理解决方案,构建项目,Foo.g
将FooLexer.cs
和FooParser.cs
。我是否应该对Foo.g
进行更新并重新编译,将忽略词法分析器和解析器C#文件的新版本并使用旧版本。我必须第二次编译......
答案 0 :(得分:1)
IDE中似乎存在一个错误:Visual Studio仅监视其自身修改的C#文件中的更改(例如,设计器生成的代码)。对于在IDE外部修改/生成的代码(例如ANTLR等外部工具),它将使用文件的内存版本,而不从磁盘刷新。
解决方法是不使用“托管”缓存,而是生成外部CSC进程来编译项目。您可以通过在.csproj中将“UseHostCompilerIfAvailable”项目属性设置为false来执行此操作:
<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>
有关详细信息,请参阅this entry in the MS Connect website。
我在Visual Studio中遇到与ANTLR完全相同的问题,这对我来说已经解决了。但是,有些人在将该选项设置为“false”后报告了项目到项目依赖性的问题,因此请注意副作用...