Home About
改善版2024)kotlin でパーサーコンビネータを実装する monad的に解決する

昨日のポスト 2024年改訂版) データ変換を Writer Monad 的に処理する を書いていて気づいたのですが、 パーサーコンビネーターのこれ 改善版2024)kotlin でパーサーコンビネータを実装する 【おまけ】 HtmlBlock の改良 って monad なんじゃないの? monad にすればいいのでは? このパーサーの問題点は HtmlBlock がハードコーディングされていて、差し換えできないこと。 AbstractBlock のような abstract クラスを使うことで差し換え可能にできるのだが、 monad としてこれを実装すれば、もっとシンプルに HtmlBlock 部分の差し換えが実現できる気がしてきた。

ただ、monad となると モナド則 を満たしてないとモナドじゃない、とかの話もあるので、 ここではあくまで、モナド的に実装したら、その問題が解決しました、といったレベルの話です。

» Read More
改善版2024)kotlin でパーサーコンビネータを実装する 【おまけ】 HtmlBlock の改良

このエントリーは 改善版2024)kotlin でパーサーコンビネータを実装する【追伸】 の続きです。

この方法を使ってパースした場合、 最後にHTMLを出力する段階で HtmlBlock をまとめるコードがあるのですが、 やっていることは同じ種類の HtmlBlock を一つにしているだけです。 しかし、 HtmlBlock を sealed class として用意しているので、それを まとめる だけの操作をするのにもこれだけのコードを書く必要があります。

» Read More
改善版2024)kotlin でパーサーコンビネータを実装する 【追伸】

このエントリーは 改善版2024)kotlin でパーサーコンビネータを実装する 【後編】Bold パーサーを追加してみる の続きです。

後編では Hello, **World**! Hello, *Again*! というイタリックとボールドマークアップが混在した文字列をパースしました。 このとき、パーサーはイタリックやボールドの開始・終了に相当するマークアップ文字列を見つけてそれを <i></i> とか <b></b> に変換するという 発想で実装していました。

別の考え方として、イタリックのマークアップで囲まれた部分がイタリック属性を持つ文字列(ここでは Again がイタリック属性を持つ文字列)、 ボールドとしてマークアップされた部分がボールド属性を持つ文字列(ここでは World )という発想もあり得ます。 直接HTMLへ変換するのではなく、いったんASTに変換したいなどといったケースでは、このような発想でパーサーを書いた方がよいでしょう。

今回は前回のコードを修正して、 この 別の考え方 で実装してみます。

» Read More
改善版2024)kotlin でパーサーコンビネータを実装する 【後編】Bold パーサーを追加してみる

このエントリーは 改善版2024)kotlin でパーサーコンビネータを実装する【前編】 からの続きです。

前編で Hello, *World*! Hello, *Again*! という文字列を自前で実装したパーサーコンビネーターを使ってHTMLに変換しました。 後編ではボールド用マークアップが混ざっていてもうまくパースできるのか調べます。

» Read More
改善版2024)kotlin でパーサーコンビネータを実装する【前編】

以前に改善版) kotlin でパーサーコンビネータを実装する を 書いたのですが、 その後さらに改良した。

ここでは Hello, *World*! という文字列を自前で実装したパーサーコンビネーターを使ってHTMLに変換することを考えます。

» Read More
独自にマークアップしたテキストをAST経由で何かに変換する

以前のエントリー 改善版) kotlin でパーサーコンビネータを実装する の続きです。

そもそもの動機としては、 マークアップがネストしていたときにパーサーコンビネータを使ってパースするにはどうすればいいのだろうか? とか考えはじめた結果の覚え書きです。

パーサーコンビネータ部分の説明は省きます。(以前のエントリーを必要なら参照のこと)

» Read More
改善版) kotlin でパーサーコンビネータを実装する

改善版2024) kotlin でパーサーコンビネータを実装する もあわせてご覧ください。

テキストをパーサーコンビネータを使ってパースすることを考えてみる 」 というのを先日考えたのですが、今回はその改善版です。

zeroOrMore パーサー の再帰部分が気に入らないので見直しました。

» Read More
kotlin でパーサーコンビネータを実装する

改善版) kotlin でパーサーコンビネータを実装する もあわせてご覧ください。

テキストをパーサーコンビネータを使ってパースすることを考えてみる。 ここで考えるパーサーコンビネータは、 パース対象となるテキストに出現するいろいろなパターンをパースできる小さなパーサを複数用意し、 それらを組み合わせて対象となるテキストをパースする。

このエントリーの最後では、簡単なマークアップをしたテキストをHTMLに変換するパーサーをつくります。

» Read More
PEG(Parsing Expression Grammar) を試す→ parboiled を使用

markdown のサブセット mini-mark のパーサを実装した話。

パーサを実装といっても、PEGで表記したものを parboiled で実装しただけです。

PEGという文法があり、これを定義しておけばパーサになる(ただしPEGを解釈して実際のパーサに変換してくれる何かしらのツール等が必要ですが)という世界らしい。(よくわかっていません。) ここでは、PEGの Java 実装の一つであるらしい parboiled を使ってパーサを実装してみます。

» Read More