html=Html(value=<span>foo</span><span>bar</span><span>hoge</span>))意図通の結果になりました。リファクタリングします。関数としてくくりだしました。生み出す高階関数です。出現順にパーサーを組み合わせていた部分をリファクタリングします。あったとしたら次のように記述できるような関数です。p}これは与えられた二つのパーサーを指定された順に実行して両方ともが成功してはじめてパーサー全体が成功となります。fooAndBarAndHoge(text)println(parseResult)というか、もっと簡単に次のように書けます。中置きできるように書き直しましょう。場合、ラムダ形式の関数で記述する方法がわからなかったので、普通の関数として定義しました。これを使えば、次のようにすっきり記述することができます。p(text)println(parseResult)実行します。html=Html(value=<span>foo</span><span>bar</span><span>hoge</span>))うまくいきました。たいしたことは何もできません。パースしようとしても、次のように失敗してしまいます。どんな順番に出現しようともパースできるパーサーをつくることを考えます。パーサーをつくります。出現順を問わずパースできるパーサーをつくることを考えます。試してその結果を返しています。これを使ってみましょう。p(text)println(parseResult)実行してみましょう。繰り返し適用すればいいじゃないか。最後までパースすることができました。文字列が追加されたとたん、最後までパースすることはできなくなります。パーサーをつくります。出現してもパースできるパーサーをつくるために必要なのものです。0回以上失敗するまで何度でも適用する関数です。再帰をつかって繰り返しパース実行しています。パースの結果が成功すれば、再帰処理を続行し、失敗した時点で、そこまでの結果を返しています。失敗しないパーサーになります。0回以上出現するパーサを生成しています。html=Html(value=<span>hoge</span><span>foo</span><span>bar</span><span>hoge</span>))うまくいきました。いう固定文字列が任意に出現した場合にパースできるパーサーを書いたところです。それでは、これを応用してマークアップをHTMLに変換していきます。アスタリスクで囲んだ部分をイタリックのHTMLとして出力したい。文字しか出現しないことにしています。実際はより複雑な条件(正規表現など)を指定すべきでしょう。イタリック以外の部分はそのままなりゆきで出力することにします。パースするパーサーをつくってみます。コンビネータは前にあるパーサーを先に評価(適用)するため、パーサーを指定する順に注意しましょう。パースした(だけの)結果になってしまいます。<i>World</i>!))うまくいきました。イタリックになりました。それでは今度はボールドについて考えます。ボールド指定したテキストをパースすることにします。いうボールドマークアップをパースするパーサーを生成する関数を書きます。出力するようにしたことです。使ってパーサを組み立てます。p(text)println(parseResult)実行します。<i>World</i>!))うまくいきました。まとめ完成したコードを掲載します。パーサーコンビネータが助けになるかもしれない。