Home About
Haskell / Parsec メモ

世の中はゴールデンウィーク。 このような心に余裕があるときにしかなかなか Haskell に取り組めない。 今日は、以前から使ってみたかった Parsec に入門した。 そのメモです。

» Read More
マークアップテキストのパース、ネストしたブロッククオートに対処(改善版)

前回のエントリー の改善版です。 Tree クラスが本来不要な情報を保持できるように定義していたことで、 コード全体が冗長になっていました。 そこを改善します。

» Read More
マークアップテキストのパース、ネストしたブロッククオートに対処

前回(マークアップテキストのパース、ブロッククオート領域をハンドルする) のエントリーで BlockQuote 領域が入れ子(ネスト)になっていても再帰処理すれば対処できるだろう、などと書いていたので、 それを試した。

» Read More
マークアップテキストのパース、ブロッククオート領域をハンドルする

マークダウン書式でいえば行頭を "> " からはじめた行は BlockQuote として扱われる。 このような領域を含んだテキストをパースして(たとえば)HTMLに変換したい場合どうすればいいか、ということを考えた。

blockquote.svg

このようなテキストをパースする場合、一度で変換をすませようとすると難しい。 また、BlockQuote 領域の中にさらに BlockQuote 領域が存在するような場合もありえる。 そのようなことまで想定すれば、一度のパースで変換を完了させるという発想は筋が悪いだろう。

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

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

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

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

» Read More
食品の原材料表記の括弧の多重入れ子文字列をパースしてトークンに分割する

たとえば無印良品のこの食品 フライパンでつくるミールキット 海老といかのアヒージョの商品表示情報のPDFをみると以下のような文字列が原材料名に記載されています。

ブロッコリー(エクアドル)、揚げじゃがいも(じゃがいも(国産)、植物油脂)、殻付き海老(インド)、いか(中国)、(一部にえび・いかを含む)

このように括弧が入れ子で多重に出現している文字列、しかも、一重/二重/三重・・・ n 重のバリエーションがある文字列をパースすることを考えたい。

最終的には以下のように括弧で括られた部分を AST(Abstract syntax tree) に 変換して、各トークンをその括弧の包含関係を生かした状態で把握できるようにしたい。

ingredients-AST

» Read More
Kotlin, fold を使って階層のあるリストをパースする

たとえば、次のようなマークアップされたセカンドレベルまで階層のあるリストを表現したテキストがあったとして、 それを kotlin の fold を使ってパースして構造化する例を考える。

» Read More
特定ルールでテキストのヘッダとボディとを分離する

kotlin でステートマシンを使って行ごとの状態を把握したい。

まあ、そんな大げさな話ではない。 テキストファイルの先頭から行ごとに調べて、見出し行が出現する直前までをヘッダとし、それ以後はボディとして扱いたい。そのためのコードをどう書くかの話。

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

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

many パーサーコンビネータ の再帰部分がどうにも気に入らないので見直しました。

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

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

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

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

» Read More