在Vs2013中使用FsLex/Yacc

ste*_*ong 5 msbuild f# fsyacc

我正在尝试恢复我在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解决方案中,如果是,如何?

Mik*_*ray 7

我不认为这些工具默认包含在随Visual Studio一起安装的F#编译器中,因此任务不存在.我使用Visual Studio 2012项目执行了以下操作,但我希望它在VS 2013中类似.以下是我必须遵循的步骤:

  1. 从nuget安装FSharp.Powerpack.这有fslex和fsyacc工具以及构建任务和目标.
  2. 卸载项目并编辑.fsproj文件.
  3. 为FSharp.Powerpack.target文件添加import语句.这将添加CallFsLexCallFsYacc构建目标.我在导入后添加了这个Microsoft.FSharp.targets:
    <Import Project="$(ProjectDir)\..\packages\FSPowerPack.Community.3.0.0.0\Tools\FSharp.PowerPack.targets" />

  4. 将这三个属性添加到文件顶部的主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选项.

  5. 要使用我们导入的目标,您需要使用要使用的输入文件定义FsLex和FsYacc项目组.您还需要为输出.fs文件添加Compile项.你最终在ItemGroup部分得到这样的东西:
    <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构建任务,但对我来说这更容易开始.