ものがたり(旧)

atsushieno.hatenablog.com に続く

RELAX NG Inference (未完成)

RelaxngInference.csとその推測されるgrammarのひな型を書いてみた。推測されるスキーマのロジカルな部分はXSD Inferenceで僕がやったことと変わらない。SOMはごちゃごちゃしていて非常に使いにくい(XmlSchemaComplexTypeにAttributesがあるのかXmlSchema{Complex|Simple}Content{Extension|Restriction}にあるのか分からない)一方で、RELAX NGを使うと、minOccurs="0" で済んでいたところをoptional要素に置き換えたりしなければならないし、内容が無い場合には明示的にempty要素を設定してやらなければならない。結果的に、コードのロジックが同じはずなのに、処理内容はずいぶん違ったものにみえるようになった。

ひな型は、とにかく分かりやすい文法を生成することが目標だ(矛盾しない設計、というのももちろんあるけど)。属性はinterleaveで囲むし、sequential contentはgroupまたはoptional/groupで囲み、lax contentはchoice/zeroOrMoreまたはchoice/oneOrMoreで囲み、名前クラスはname以外は一切使わない。要素と属性は全てグローバル定義、テキストと要素のchoiceは無しで全てmixed、属性のemptyは推測しない。

決定的内容モデルになるようになっているはずなので、将来的にstrongly-typed APIにも使えるかもしれない。