特に他の人が読むことを想定して書いていないので、あしからず。Parser Combinatorに関しては、Scala風味の記述で。
- 0階PEGは、相互再帰的なlazyな値(
=> Parser[T]
)の集まり(式はPrimitiveと基本的なCombinatorで構成される)- Primitive
- 文字列リテラル:
"str": Parser[String]
- 空文字列:
"": Parser[String]
- 非終端記号の参照
- 文字列リテラル:
- 基本的なCombinator
- 順序付き選択
(e1 / e2):(Parser[T], Parser[T]) => Parser[T]
- 繰り返し:
e * or e+: Parser[T] => Parser[List[T]]
- And述語:
& e: Parser[T] => Parser[Unit]
- Not述語:
! e: Parser[T] => Parser[Unit]
- 0回または1回の繰り返し:
e ?: Parser[T] => Parser[Option[T]]
- 順序付き選択
- Primitive
- Macro PEGは、0階PEGに対応するParser Combinatorに加え、
Parser[T] => Parser[U]
型の関数の定義を許したもの - 後方参照
(str:e1 e2)
の拡張は、Parser Combinatorでは、evalWithContinuation: (Parser[String] => (Parser[String] => Parser[T]))
のような関数として考えることができるe1
を評価した結果、「消費された」文字列にマッチするようなParser[String]
を引数にとり別のParser[T]
を返す
- Higer Order Macro PEGは、
Parser[A1] => Parser[A2] => ... Parser[An]
のような型の関数を許す- 無名関数も書けるように(ただし、現状のMacro PEGでは、無名関数を置ける場所に制限あり)
- 動的スコープVS.静的スコープ
- 動的スコープ
- 文脈を持ちまわる手間がはぶける
- Parser Combinatorに素直に対応が付かない
- 静的スコープ
- Parser Combinatorに素直に対応が付く
- レキシカルクロージャが定義できるが…
- 動的スコープ
- 値呼び出しと名前呼び出し
- 何も考えずに定義すれば、名前呼び出しになる
- Macro PEGにおける値呼び出しってなんだ?
- to be continued ...