その2です。LPegの日本語解説が世界的に少ないので多少の需要があると信じて書いていきたい。

Pattern

lpeg.P(val) つづき

  • type(val) == "number" and val > 0

    任意のval文字にマッチ。雑に正規表現だと/^.{val}/のような感じになる。 実は省略が可能

> import P, C, S, R, match from require "lpeg"
> P(2)\match "aiueo"
3 -- マッチ後の位置
> C(2)\match "aiueo"
"ai"
> (P(1) * 2)\match "aiueo" -- == (P(1) * P(2))\match "aiueo"
4

lpeg.Cはpatternを取りキャプチャを返します。そのうち書きます。lpeg.matchはマッチです(雑)。

演算子

pat1 - pat2

"pat2を含まないpat2にマッチするパターン"を還す。\(!pat2 pat1\)

上記のlpeg.P(number)と合わせてみる。

> C(2 - P("ae"))\match "ai"
"ai"
> C(2 - P("ae"))\match "ao"
"ao"
> --> nothing

ただどうしてもこのマイナスを四則演算として処理され、エラーなどになることがあるので省略できないこともある。う〜ん動的型付け

pat / func

patにマッチしたとき、マッチした文字列をfuncに渡し、マッチ時にfuncが即実行される。

> p = P("aiueo") / (...) -> print "match: #{...}"
> p2 = P"kakikukeko"
> p2 = P"kakikukeko" / (...) -> print "match2: #{...}"
> C(p * p2)\match "aiueokakikukeko"
match: aiueo
match2: kakikukeko
"aiueokakikukeko"

そろそろ寝ます。