FPARSECのアップグレード:差別された組合をアップグレードして、新しい平等/比較の制約を満たす

StackOverflow https://stackoverflow.com/questions/2290103

質問

だから、aによって こんにちはlarIousシリーズのイベント, 、FPARSECソースをダウンロードして構築しようとしました。残念ながら、それは新しい1.9.9.9と互換性がありません。簡単な問題を修正しましたが、まだ機能しない差別された組合がいくつかあります。

具体的には、 ドン・シムの投稿 タイプのアイテムを含む差別された組合が説明している obj また -> オブジェクトは比較をサポートせず、関数も平等をサポートしないため、平等や比較の制約を自動的に取得しないでください。 (自動的に生成された平等/比較が以前にバギーだったかどうかは明らかではありませんが、コードが生成されなくなったのでコンパイルさえしません。)

問題のあるDUSの例をいくつか紹介します。

type PrecedenceParserOp<'a,'u'> =
     | PrefixOp of string * Parser<unit,'u> * int * bool * ('a -> 'a)
     | others ...

type ErrorMessage =
     | ...
     | OtherError of obj
     | ...

問題は次のとおりです。

member t.RemoveOperator (op: PrecedenceParserOp<'a, 'u>) =
    // some code ...
    if top.OriginalOp <> op then false // requires equality constraint
    // etc etc ...

または、比較制約の場合

let rec printMessages (pos: Pos) (msgs: ErrorMessage list) ind =
    // other code ...
    for msg in Set.ofList msgs do // iterate over ordered unique messages
        // etc etc ...

私が言うことができる限り、各インスタンスに一意のINTでタグを付けるというドンのソリューションは、カスタムの平等/比較制約を実装する正しい方法です(または、DUの個々のブランチを順序付けることができるように、おそらく一意のINTタプルです)。しかし、これはDUのユーザーにとって不便です。現在、DUの構築には、次のスタンプを取得するために関数を呼び出す必要があります。

タグ獲得を隠し、同じコンストラクターをライブラリのユーザーに提示する方法はありますか?つまり、インターフェイスを変更せずに実装を変更することですか?これは(コードを理解していることから)見えるので特に重要です PrecedenceParserOp パブリックタイプです。

役に立ちましたか?

解決

FPARSEC用にどのソースをダウンロードしましたか? FPARSECから最新のものをつかみました Bitbucketリポジトリ, 、そして、VS 2010 RCでコンパイルするためにFPARSECソースに変更を加える必要はありませんでした。

編集:私はそれを取り戻します。 InterplexyaccおよびInterpfparsecのサンプルプロジェクトからビルドエラーが発生しましたが、Core FPARSECおよびFPARSECCSプロジェクトは正常に構築されました。

他のヒント

できることの1つは、追加することです [<CustomEquality>][<CustomComparison>] 独自の属性を定義します .Equals オーバーライドと IComparable 実装。もちろん、これはあなたが obj_ -> _ コンポーネントは適切な方法で自分自身であり、それは可能であるかもしれません。何が渡されているのかを制御できる場合 OtherError コンストラクター、あなたはこの作品を作ることができるはずです ErrorMessage ダウンキャスティングで入力します obj それ自体が構造的に同等のタイプに。しかし PrecendenceParserOp ケースは少し難しいです - 比較する必要がない限り、関数コンポーネントに参照等式を使用することで取得できるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top