正規表現の山を捨て、LispでOrgモードを解析するPEGパーサー「OrgWebAlchemy」
Parsing Expression Grammar vs. Regexes: Building Org Parser in Lisp, Export HTML

Orgモードの解析に正規表現では限界を感じた作者が、Guile Schemeの(ice-9 peg)を使ったParsing Expression GrammarでOrgWebAlchemyを開発。Org文書をASTに変換し、SXML経由でHTMLへレンダリングする。Emacs不要でOrgをHTML化でき、ネストしたリストやインライン装飾、リンク、ソースブロックなど主要構文をサポート。GNU LGPL v3で公開され、Guixパッケージ化も予定されている。
それはもはや言語を記述しているのではありません。パーサーのバグの歴史を記述しているのです。
HNでの議論
20- zelphirkalt
はは、それは面白いね。
ずいぶん前に、orgシンタックスのためにまさにそういうプロジェクトを始めたんだ。でもあまり進まなかった。orgのものごとは一度にまとめてパースして理解するのは無理なんじゃないかと思えたからね。たとえばTODOキーワードはorgファイルの先頭で指定できて、それが文書内の見出しの解釈に影響する。これは単なるPEGではできないんだ。
もう一つの厄介な点はネストしたインラインマークアップだ。イタリックの中のボールド?ボールドの中のverbatim、そのイタリックの中?などなど。再帰的なルールで意味のある組み合わせを全部サポートできたら最高だね。Orgにはインラインマークアップがたくさんある。プログラミング言語固有のインラインマークアップ要素さえある。
もう一つの問題は、GuileのPEGライブラリが、文法ルールの非文字列形式を使うとき、相互再帰的な文法ルールを許さないことだ。バグのせいでね(その点ではエクセレントじゃないけど、他の点ではエクセレントなんだ!)。ルールの文字列形式を使わざるを得なくて、残念ながら使い勝手がずっと悪くなる。いつか直ってほしい。その点以外はこのライブラリが好きだからね。しかも標準ライブラリにあるから、依存関係をインストールする必要がない。たとえばAoCのパズル入力なんかに使うのが好きなんだ。
どこまで進んだのか読むのが楽しみだ。
編集:あと、orgのための実際の文法ベースのパーサーがあるのは素晴らしいことだ。これで他のツール用、たとえばgitホスティング上のリポジトリのreadmeのパーサーなんかを作るのが楽になる。
- remywang
PEGについてのクールな豆知識が一つ。PEGがすべての文脈自由言語をパースできるかどうかは未解決問題なんだ。
- le-mark
この文脈での「Org」はemacs org modeのことだ。このご時世に、階層的なテキスト形式を見て「正規表現」と思う人がいるなんて変だな!