たとえば無印良品のこの食品 フライパンでつくるミールキット 海老といかのアヒージョの商品表示情報のPDFをみると以下のような文字列が原材料名に記載されています。
ブロッコリー(エクアドル)、揚げじゃがいも(じゃがいも(国産)、植物油脂)、殻付き海老(インド)、いか(中国)、(一部にえび・いかを含む)
このように括弧が入れ子で多重に出現している文字列、しかも、一重/二重/三重・・・ n 重のバリエーションがある文字列をパースすることを考えたい。
最終的には以下のように括弧で括られた部分を AST(Abstract syntax tree) に 変換して、各トークンをその括弧の包含関係を生かした状態で把握できるようにしたい。
たとえば、次のようなマークアップされたセカンドレベルまで階層のあるリストを表現したテキストがあったとして、 それを kotlin の fold を使ってパースして構造化する例を考える。
» Read Morekotlin でステートマシンを使って行ごとの状態を把握したい。
まあ、そんな大げさな話ではない。 テキストファイルの先頭から行ごとに調べて、見出し行が出現する直前までをヘッダとし、それ以後はボディとして扱いたい。そのためのコードをどう書くかの話。
» Read More「 テキストをパーサーコンビネータを使ってパースすることを考えてみる 」 というのを先日考えたのですが、今回はその改善版です。
many パーサーコンビネータ の再帰部分がどうにも気に入らないので見直しました。
» Read More改善版) kotlin でパーサーコンビネータを実装する もあわせてご覧ください。
テキストをパーサーコンビネータを使ってパースすることを考えてみる。 ここで考えるパーサーコンビネータは、 パース対象となるテキストに出現するいろいろなパターンをパースできる小さなパーサを複数用意し、 それらを組み合わせて対象となるテキストをパースするコンビネータ。 パーサーを自在に組み合わせてパースできるから、パーサーコンビネータ。
このエントリーの最後では、簡単なマークアップをしたテキストをHTMLに変換するパーサーをつくります。
» Read More