ここで考えられる構成は仕様のツリーであり、各仕様には対応するキーワード (文字列) と型があることを念頭に置いています。このようなもの:
data Select = And | Or
data ConfigTree = Node Select [ConfigTree] | Leaf (String, *)
「型の型」がないので、これを適切に記述する方法がわかりませんが、今のところ気にしないでください。
さて、このようなツリーが与えられたので、可能な有効な構成を読み取ることができるパーサーを構築したいと思います。キーワード/タイプのペアを解析できるサブパーサーが既にあると思います。
たとえば、考えられる構成ツリーは次のとおりです。
Node And [ Leaf ("width", Double)
, Node Or [ Leaf ("height", Double) , Leaf ("aspectratio", Double)
]
長方形のサイズを指定できます。可能な構成ファイルは、たとえば次のようになります。
aspectratio = 2
width = 10
(構成ファイルは、改行で区切られたペアの単なるリスト、keyword = blah であると仮定しましょう。ここで、blah は、そのキーワードに対応するパーサーが処理できるものです。ただし、それらは任意の順序である可能性があり、1 つと一致する必要があります。ツリーの可能な「有効なサブセット」。有効なサブセットとは、最上位ノードを含む任意のサブセットであり、それが含む「and」ノードのすべての子を含み、「or」ノードの子を 1 つだけ含みます。)
そのようなパーサーの構築を開始する方法さえわかりません。続行する方法、または上記の ConfigTree データ型をより解析しやすいものに完全に再構築する方法について、誰かがいくつかのヒントを与えることができますか?