正規表現の山を捨て、LispでOrgモードを解析するPEGパーサー「OrgWebAlchemy」

Parsing Expression Grammar vs. Regexes: Building Org Parser in Lisp, Export HTML

正規表現の山を捨て、LispでOrgモードを解析するPEGパーサー「OrgWebAlchemy」

Orgモードの解析に正規表現では限界を感じた作者が、Guile Schemeの(ice-9 peg)を使ったParsing Expression GrammarでOrgWebAlchemyを開発。Org文書をASTに変換し、SXML経由でHTMLへレンダリングする。Emacs不要でOrgをHTML化でき、ネストしたリストやインライン装飾、リンク、ソースブロックなど主要構文をサポート。GNU LGPL v3で公開され、Guixパッケージ化も予定されている。

それはもはや言語を記述しているのではありません。パーサーのバグの歴史を記述しているのです。
  1. zelphirkalt

    はは、それは面白いね。

    ずいぶん前に、orgシンタックスのためにまさにそういうプロジェクトを始めたんだ。でもあまり進まなかった。orgのものごとは一度にまとめてパースして理解するのは無理なんじゃないかと思えたからね。たとえばTODOキーワードはorgファイルの先頭で指定できて、それが文書内の見出しの解釈に影響する。これは単なるPEGではできないんだ。

    もう一つの厄介な点はネストしたインラインマークアップだ。イタリックの中のボールド?ボールドの中のverbatim、そのイタリックの中?などなど。再帰的なルールで意味のある組み合わせを全部サポートできたら最高だね。Orgにはインラインマークアップがたくさんある。プログラミング言語固有のインラインマークアップ要素さえある。

    もう一つの問題は、GuileのPEGライブラリが、文法ルールの非文字列形式を使うとき、相互再帰的な文法ルールを許さないことだ。バグのせいでね(その点ではエクセレントじゃないけど、他の点ではエクセレントなんだ!)。ルールの文字列形式を使わざるを得なくて、残念ながら使い勝手がずっと悪くなる。いつか直ってほしい。その点以外はこのライブラリが好きだからね。しかも標準ライブラリにあるから、依存関係をインストールする必要がない。たとえばAoCのパズル入力なんかに使うのが好きなんだ。

    どこまで進んだのか読むのが楽しみだ。

    編集:あと、orgのための実際の文法ベースのパーサーがあるのは素晴らしいことだ。これで他のツール用、たとえばgitホスティング上のリポジトリのreadmeのパーサーなんかを作るのが楽になる。

  2. remywang

    PEGについてのクールな豆知識が一つ。PEGがすべての文脈自由言語をパースできるかどうかは未解決問題なんだ。

  3. le-mark

    この文脈での「Org」はemacs org modeのことだ。このご時世に、階層的なテキスト形式を見て「正規表現」と思う人がいるなんて変だな!

この日のほかの記事

2026-09-26