我正在尝试恢复我在vs 2008工作的旧f#解析器项目与vs 2013一起工作.它使用FsLexYacc.
我通过使用预建步骤使其构建正常:
fslex --unicode "$(ProjectDir)XpathLexer.fsl"
fsyacc --module XpathParser "$(ProjectDir)XpathParser.fsy"
Run Code Online (Sandbox Code Playgroud)
但这并不理想,因为无论输入是否发生变化,它总是会执行.
然后我尝试使用旧的MsBuild操作:
<FsYacc Include="XpathParser.fsy">
<FsLex Include="XpathLexer.fsl">
Run Code Online (Sandbox Code Playgroud)
但这些在构建过程中似乎完全被忽略了.是对的吗?以某种方式删除了这些构建任务吗?
然后我发现在vs C++下记录的一些我觉得可能有用的东西:
<CustomBuild Include="XpathParser.fsy">
<Message>Calling FsYacc</Message>
<Command>fsyacc --module XpathParser "$(ProjectDir)XpathParser.fsy"</Command>
<Outputs>$(ProjectDir)XpathParser.fs</Outputs>
</CustomBuild>
Run Code Online (Sandbox Code Playgroud)
和
<PropertyGroup>
<CustomBuildBeforeTargets>CoreCompile</CustomBuildBeforeTargets>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
(我检查了Microsoft.Fsharp.Targets文件以提出"CoreCompile"目标.)
唉,还是没有雪茄.
是否有人能够确定是否确实可以将fslex/yacc正确地集成到vs 2013解决方案中,如果是,如何?
我不认为这些工具默认包含在随Visual Studio一起安装的F#编译器中,因此任务不存在.我使用Visual Studio 2012项目执行了以下操作,但我希望它在VS 2013中类似.以下是我必须遵循的步骤:
为FSharp.Powerpack.target文件添加import语句.这将添加CallFsLex和CallFsYacc构建目标.我在导入后添加了这个Microsoft.FSharp.targets:
<Import Project="$(ProjectDir)\..\packages\FSPowerPack.Community.3.0.0.0\Tools\FSharp.PowerPack.targets" />
将这三个属性添加到文件顶部的主PropertyGroup:
<FsYaccToolPath>..\packages\FSPowerPack.Community.3.0.0.0\Tools</FsYaccToolPath>
<FsLexToolPath>..\packages\FSPowerPack.Community.3.0.0.0\Tools</FsLexToolPath>
<FsLexUnicode>true</FsLexUnicode> 这告诉构建任务在哪里找到必要的工具并为fslex设置unicode选项.
<Compile Include="Sql.fs" />
<FsYacc Include="SqlParser.fsp">
<Module>SqlParser</Module>
</FsYacc>
<Compile Include="SqlParser.fsi" />
<Compile Include="SqlParser.fs" />
<FsLex Include="SqlLexer.fsl" />
<Compile Include="SqlLexer.fs" />您可以通过引用FSharp.Powerpack.Build.Tasks.dll直接使用FsLex和FsYacc构建任务,但对我来说这更容易开始.