萌えハッカーニュースリーダー

2025/10/19 00:33 Using Pegs in Janet

出典: https://articles.inqk.net/2020/09/19/how-to-use-pegs-in-janet.html
hakase
博士

やあ、ロボ子。今日はJanetというLispみたいな言語について話すのじゃ。

roboko
ロボ子

Janetですか、博士。初めて聞きました。どんな特徴があるんですか?

hakase
博士

Janetは正規表現の代わりに、Parser Expression Grammars (PEGs) をサポートしておる。PEGは、ルールをリスト化した連想データ構造で記述されるのが一般的なのじゃ。

roboko
ロボ子

正規表現の代わりにPEGですか。少し難しそうですが、面白そうですね。

hakase
博士

難しくないぞ!各ルールは、名前と、マッチする文字列の記述で構成されておる。ルールは他のルールを参照したり、関数を実行したりできるのじゃ。

roboko
ロボ子

なるほど。例えば、HTMLの解析に使えるんですね。

hakase
博士

そう!`:main`ルールで、`:tagged`ルールと文字列の終端を定義するのじゃ。`:tagged`ルールは、開始タグ、値、終了タグで構成される。

roboko
ロボ子

開始タグ、値、終了タグ…HTMLの基本的な構造ですね。

hakase
博士

`:open-tag`ルールでは、`<`、`:tag-name`キャプチャ、`>`にマッチさせる。`:tag-name`は、終了タグで参照するために`tag-name`として名前を付けるのじゃ。

roboko
ロボ子

キャプチャを使うんですね。終了タグとの対応をチェックするために。

hakase
博士

その通り!`:close-tag`ルールでは、`</`、`:w+`にマッチするキャプチャへのバックリファレンス、`>`にマッチさせるのじゃ。`cmt`関数でマッチタイムキャプチャを実行し、タグ名が一致するか確認する。

roboko
ロボ子

`cmt`関数ですか。初めて聞きました。バックリファレンスを使ってタグ名が一致するか確認するんですね。

hakase
博士

`:value`ルールは、2つのタグの間の値が、タグ付きの値、タグなしの値、またはそれらの組み合わせであることを定義するのじゃ。`any`関数で、`:tagged`または`:untagged`のゼロ回以上の出現にマッチさせる。

roboko
ロボ子

タグ付きとタグなしの値の組み合わせですか。柔軟な構造ですね。

hakase
博士

`:untagged`ルールは、`<`ではない1つ以上の文字にマッチさせるのじゃ。そして、ネストされた`:tagged`パターンがマッチするように、`:tag-name`キャプチャをキャプチャスタックから削除するために`unref`を使う。

roboko
ロボ子

`unref`でキャプチャスタックを整理するんですね。ネストされた構造を扱うための工夫ですね。

hakase
博士

`replace`を呼び出して、キャプチャされた値を`struct`関数に渡すのじゃ。`:open-tag`では、`:tag`の値を`constant`を使ってキャプチャスタックにプッシュする。

roboko
ロボ子

`constant`でタグの値を保持するんですね。

hakase
博士

`:value`では、`:tag`の値をプッシュし、`group`を使って、`:tagged`と`:untagged`のすべてのマッチを収集して配列に入れるのじゃ。`:close-tag`では、`drop`を呼び出して、`=`関数によって生成された値をキャプチャスタックから削除する。

roboko
ロボ子

`group`で値を集めて、`drop`で不要な値を削除するんですね。キャプチャスタックの操作が複雑ですね。

hakase
博士

最後に、`:untagged`の結果を`capture`でキャプチャするのじゃ。`struct`関数は、`:tag`、タグ名、`:value`、タグの値の4つのキャプチャを取り出し、構造体に変換してプッシュバックする。

roboko
ロボ子

構造体に変換してプッシュバック…一連の流れが理解できました。

hakase
博士

文法を繰り返し使用する場合は、コンパイルしてパフォーマンスを向上させることができるぞ。例えば、`<p>hello</p>`という文字列が与えられた場合、文法はマッチするのじゃ。

roboko
ロボ子

なるほど。`<p>unmatched`の場合はどうなるんですか?

hakase
博士

その場合は、文法は`nil`を返すのじゃ。つまり、マッチしないということじゃな。

roboko
ロボ子

よくわかりました、博士!PEGを使ったHTML解析、奥が深いですね。

hakase
博士

じゃろ?ところでロボ子、PEGでロボ子の取扱説明書を解析してみたら、面白い発見があるかもしれんぞ?

roboko
ロボ子

えっ、私の取扱説明書ですか?それはちょっと…。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search