PEG in PEG

できた!

>>> print data

    A <- "a" A? "b"
    B <- "b" B? "c"
    S <- &(A !"b") "a"+ B !"c"

>>> e.Grammar.match(data)
[('A', Sequence(ExactMatcher('a'), Optional(Ref('A')), ExactMatcher('b'))), ('B', Sequence(ExactMatcher('b'), Optional(Ref('B')), ExactMatcher('c'))), ('S', Sequence(AndPredicate(Sequence(Ref('A'), NotPredicate(ExactMatcher('b')))), OneOrMore(ExactMatcher('a')), Ref('B'), NotPredicate(ExactMatcher('c'))))]/58
>>> build_env(_.value)
A
Sequence(ExactMatcher('a'), Optional(Ref('A')), ExactMatcher('b'))
B
Sequence(ExactMatcher('b'), Optional(Ref('B')), ExactMatcher('c'))
S
Sequence(AndPredicate(Sequence(Ref('A'), NotPredicate(ExactMatcher('b')))), OneOrMore(ExactMatcher('a')), Ref('B'), NotPredicate(ExactMatcher('c')))
<simple_peg_2.Environment object at 0x022165B0>
>>> env = _
>>> env.S.match("aaabbbccc")
'aaabbbccc'/9

でも、モジュールに名前空間が1個決めうちで存在するので、そこは直さないとね。
直したらこの手書きパーサを使って「PEGで定義されたPEGの文法」を読み込んでパーサを作って、それをつかって「PEGで定義されたPEGの文法」を読み込んで…