Home About Contact
fern-parser をリリースした

The fern-parser logo

昨年くらいから断続的にテキストパーサーを調べて実験コードを書いてきた (この辺の話)のですが、 機能変更が落ち着いてきたのでとりあえず公開しました。TypeScript 版です。 ライセンスは MIT です。 このブログで書いてきたパーサーコンビネータは Kotlin で実装しているのですが、 それを TypeScript に移植してあれこれ修正したものです。 ライブラリ本体は TypeScript で書いていますが、パースするコードを書くときは JavaScript でゆるくかけるので楽です。

Kotlin 版では tailrec が使えたので深い再帰が発生してもスタックオーバーフローにはならないと思うのですが、 TypeScript 版はそのあたりの対策は今のところしていません。 そんな巨大なテキストをパースすることもないのかな。

» Read More
「改善版2024)Kotlin でパーサーコンビネータを実装する HtmlWriter の導入」のコードを TypeScript にする(その3)

その2の続きです。 今まではパーサーが letter, zeroOrMore しか用意していなかったので、 HelloWrold! などという中途半端な文字列をパースする例で説明していた。 今回は普通に Hello, World! 文字列をパースできるように、 one, and および seq パーサーを追加します。

» Read More
「改善版2024)Kotlin でパーサーコンビネータを実装する HtmlWriter の導入」のコードを TypeScript にする(その2)

その1のコードの HtmlBlock 部分の実装を差しかえられるように Generics にします。

» Read More
「改善版2024)Kotlin でパーサーコンビネータを実装する HtmlWriter の導入」のコードを TypeScript にする(その1)

改善版2024)Kotlin でパーサーコンビネータを実装する HtmlWriter の導入で書いたコードを TypeScript に書きかえます。

» Read More
「改善版2024)kotlin でパーサーコンビネータを実装する HtmlWriter の導入」のコードを Vanilla JS に書きかえ

改善版2024)kotlin でパーサーコンビネータを実装する HtmlWriter の導入で書いたコードを JavaScript に書きかえたのでその覚えがきです。

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

このポスト 2024年改訂版) データ変換を Writer Monad 的に処理する を書いていて このパーサーコンビネーター( 改善版2024)kotlin でパーサーコンビネータを実装する 【おまけ】 HtmlBlock の改良) は Writer モナド的な発想で書けばもう少しパーサーのインタフェースがシンプルになることに気づいた。

その覚え書きです。

» 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