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の文法」を読み込んで…