2013-11-05 31 views
5

私はvs 2013で動作するように私が2008年に働いていた古いf#パーサープロジェクトを復活させようとしています。それはFsLexYaccを使用します。Vs2013でFsLex/Yaccを使用する

私はそれがためとして事前に作成ステップを使用して、[OK]を構築しました:

fslex --unicode "$(ProjectDir)XpathLexer.fsl" 
fsyacc --module XpathParser "$(ProjectDir)XpathParser.fsy" 

しかし、それは常に入力が変更されているかどうかを実行時に、これは、理想的な未満です。

私はその後、ちょうど古いのMSBuildアクションを使用してみました:

<FsYacc Include="XpathParser.fsy"> 
<FsLex Include="XpathLexer.fsl"> 

が、これらは完全にビルドプロセス中に無視しているように見えました。そうですか?これらのビルドタスクは何とか削除されましたか?

私は、私はうまくいくかもしれないと思ったC++対の下で文書化され、いくつかのものが見つかりました:

<CustomBuild Include="XpathParser.fsy"> 
    <Message>Calling FsYacc</Message> 
    <Command>fsyacc --module XpathParser "$(ProjectDir)XpathParser.fsy"</Command> 
    <Outputs>$(ProjectDir)XpathParser.fs</Outputs> 
</CustomBuild> 

<PropertyGroup> 
    <CustomBuildBeforeTargets>CoreCompile</CustomBuildBeforeTargets> 
</PropertyGroup> 

を(私が思い付くするMicrosoft.Fsharp.Targetsファイルを検査」 CoreCompile "ターゲット)

ああ、まだ葉巻はありません。

fslex/yaccをvs 2013ソリューションに正しく組み込むことができるかどうかは誰にでも分かりますか?

答えて

7

これらのツールは、Visual StudioにインストールされているF#コンパイラではデフォルトでは含まれていないと思われますので、タスクは存在しません。私は、Visual Studio 2012のプロジェクトで、次のでしたが、私はそれがここにVS 2013年に似ているだろうと期待しており、私は従わなければならなかった手順だった:

  1. がnugetからFSharp.Powerpackをインストールします。これには、fslexおよびfsyaccツールとビルドタスクとターゲットがあります。
  2. プロジェクトをアンロードし、.fsprojファイルを編集します。
  3. FSharp.Powerpack.targetファイルのインポートステートメントを追加します。これにより、CallFsLexCallFsYaccビルドターゲットが追加されます。
    <Import Project="$(ProjectDir)\..\packages\FSPowerPack.Community.3.0.0.0\Tools\FSharp.PowerPack.targets" />

  4. は、ファイルの先頭にメインPropertyGroupにこれらの3つのプロパティを追加します:私はMicrosoft.FSharp.targetsのためにインポートした後にこれを追加 <FsYaccToolPath>..\packages\FSPowerPack.Community.3.0.0.0\Tools</FsYaccToolPath> <FsLexToolPath>..\packages\FSPowerPack.Community.3.0.0.0\Tools</FsLexToolPath> <FsLexUnicode>true</FsLexUnicode>これは必要なツールを見つけるためにビルドタスクを告げるとのUnicodeオプションを設定し、 fslex。

  5. インポートしたターゲットを使用するには、使用する入力ファイルを含むFsLexおよびFsYaccアイテムグループを定義する必要があります。また、出力する.fsファイルのコンパイル項目を追加する必要があります。あなたは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" />

あなたがFsLexとFsYaccを使用することができるかもしれませんFSharp.Powerpack.Build.Tasks.dllを参照しますが、私のために直接タスクを構築しますこれは簡単に行くことができました。

+1

マイクをありがとう。悲しいかな、私はまだそれを働かせることができませんでした。ビルドはlex/yaccの入力を完全に無視します。私はFSharp.Powerpack.Build.Tasks.dllを直接参照してみましたが、まだ葉巻はありません。 – stephensong

+0

私の経験と一致しているようです – nicolas

+0

@stephensongあなたは全くエラーがありませんか? – nicolas

1

これは私のためにどのような作品です(Windows 7のx64の、Visual Studioの2013アルティメットRTM):

  1. 取得し、CodePlexのから "FSharp 3.0 + .NET 4.xの+ VS2012用のパワーパック" をインストール(https://fsharppowerpack.codeplex.com/downloads/get/625449

  2. 次のレジストリキーを作成します:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AssemblyFolders\FSharp.PowerPack-1.9.9.9(のWindows x64バージョンのため、32ビットバージョンのWow6432Nodeを省略する)とF#のパワーパックのインストールディレクトリにその(Default)値を設定します(例:「C:\プログラムファイル(x86の)\ FSharpPowerPack-4.0.0.0 \ bin ")。 [これは、基本的にツールの発見を壊すsrc/FSharp.PowerPack/CompilerLocationUtils.fsで長年/回帰バグに関連している。]

  3. 輸入パワーパックの目標をあなた*の.fsprojファイル(F#の目標をインポートした後):<Import Project="$(MSBuildExtensionsPath32)\FSharp\1.0\FSharp.PowerPack.targets" />

  4. 更新このような何かにあなたのItemGroupノードが(従ってFsYaccを使用):

    <ItemGroup> 
        <None Include="App.config" /> 
        <FsLex Include="Lexer.fsl" /> 
        <Compile Include="Lexer.fs"> 
        <Visible>False</Visible> 
        </Compile> 
        <Compile Include="Program.fs" /> 
    </ItemGroup> 
    
  5. FSharp.PowerPack.dllとビルドへの参照を含めます。あなたが*で終わる必要があります

は次のようにファイル.fsproj:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> 
    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
    <SchemaVersion>2.0</SchemaVersion> 
    <ProjectGuid>8c565f99-d6bc-43a9-ace9-eadfe429c0f7</ProjectGuid> 
    <OutputType>Exe</OutputType> 
    <RootNamespace>FsYaccTest</RootNamespace> 
    <AssemblyName>FsYaccTest</AssemblyName> 
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> 
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> 
    <TargetFSharpCoreVersion>4.3.1.0</TargetFSharpCoreVersion> 
    <Name>FsYaccTest</Name> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    <!-- Snip --> 
    </PropertyGroup> 
    <ItemGroup> 
    <Reference Include="FSharp.PowerPack"> 
     <HintPath>C:\Program Files (x86)\FSharpPowerPack-4.0.0.0\bin\FSharp.PowerPack.dll</HintPath> 
    </Reference> 
    <Reference Include="mscorlib" /> 
    <Reference Include="FSharp.Core, Version=$(TargetFSharpCoreVersion), Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> 
     <Private>True</Private> 
    </Reference> 
    <Reference Include="System" /> 
    <Reference Include="System.Core" /> 
    <Reference Include="System.Numerics" /> 
    </ItemGroup> 
    <PropertyGroup> 
    <MinimumVisualStudioVersion Condition="'$(MinimumVisualStudioVersion)' == ''">11</MinimumVisualStudioVersion> 
    </PropertyGroup> 
    <Choose> 
    <When Condition="'$(VisualStudioVersion)' == '11.0'"> 
     <PropertyGroup Condition="Exists('$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets')"> 
     <FSharpTargetsPath>$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets</FSharpTargetsPath> 
     </PropertyGroup> 
    </When> 
    <Otherwise> 
     <PropertyGroup Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets')"> 
     <FSharpTargetsPath>$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets</FSharpTargetsPath> 
     </PropertyGroup> 
    </Otherwise> 
    </Choose> 
    <Import Project="$(FSharpTargetsPath)" /> 
    <Import Project="$(MSBuildExtensionsPath32)\FSharp\1.0\FSharp.PowerPack.targets" /> 
    <PropertyGroup> 
    <FsLexUnicode>true</FsLexUnicode> 
    </PropertyGroup> 
    <ItemGroup> 
    <None Include="App.config" /> 
    <FsLex Include="Lexer.fsl" /> 
    <Compile Include="Lexer.fs"> 
     <Visible>False</Visible> 
    </Compile> 
    <Compile Include="Program.fs" /> 
    </ItemGroup> 
</Project> 

注:マイクZの答えで説明したように、あなたが適切なFsYaccToolPathを提供している場合は、レジストリキーを作成し、おそらく省略することができます。

+1

ありがとう。あなたの答えを隠すだけで、なぜFsharp.Powerpackが放棄されているのかがわかります - はい?本当にバロック、奇妙な。私は悲しいことに、F#はこのような愚かな問題のために衰えを続けている。明らかに、M $は単にF#について真剣ではない。 – stephensong

+0

F#PowerPackがCodePlexからGitHub(https:// github。com/fsharp/powerpack)でも、それほど多くの活動はありません。 FsYaccとFsLexはまだ放棄されているように見えますが(おそらくまだF#コンパイラ自体はまだ更新されているでしょうが)、ほとんどの機能はさまざまなプロジェクトで開発されています。私はどこでも公式の声明は見つけられませんが、Microsoftは現在一般的に.Netに比べてC++/Win8にもっと力を入れているようです。 – JPW

1

これそれが動作するようになります - あなたは、詳細なhereとして別々のFsLexYacc nugetパッケージを使用している場合、私の経験では、少なくとも、次に(githubのexampleから抽出された)あなたのfsprojファイルに次のように置く:

次の他のすべての輸入品へ:

<Import Project="..\packages\FsLexYacc.6.0.4\bin\FsLexYacc.targets" /> 

など、など

し、ソースファイル用:

<FsYacc Include="Parser.fsp"> 
    <OtherFlags>--module SqlParser</OtherFlags> 
</FsYacc> 
<FsLex Include="Lexer.fsl"> 
    <OtherFlags>--unicode</OtherFlags> 
</FsLex> 

fsprojファイルを編集する以外に何もする必要はなく、nugetパッケージをインストールしてください。

関連する問題