Greetings. Attached is a patch that I'm currently using in Pugs's bundled PGE.pbc, in order to make PGE output properly escaped strings, in a format ready to be used form Haskell FFI.
I'd appreciate comments, and if it's okay to commit it back to the PGE directory. Thanks, /Autrijus/
==== Patch <-> level 1 Source: [No source] Target: d31e2699-5ff4-0310-a27c-f18f2fbe73fe:/trunk/compilers/pge:8010 (http://svn.perl.org/parrot/trunk) Log: * Haskell-compatible dump of matches === PGE/Hs.pir ================================================================== --- PGE/Hs.pir (revision 8010) +++ PGE/Hs.pir (patch - level 1) @@ -0,0 +1,130 @@ +=head1 Title + +PGE::Hs - Match and display PGE rules as Haskell expressions + +=head1 SYNOPSIS + + .sub _main + load_bytecode "PGE.pbc" + $P0 = find_global "PGE::Hs", "match" + $S0 = $P0("Hello\n", "H(.)llo(.)") + print $S0 # Just [(0, "Hello\n"), (1, "e"), (5, "\n")] + .end + +=cut + +.namespace [ "PGE::Hs" ] + +.sub __onload + load_bytecode "library/Data/Escape.imc" +.end + +.sub "match" method + .param string x + .param string pattern + .local pmc rulesub + .local pmc match + .local pmc p6rule_compile + .local string out + + find_global p6rule_compile, "PGE", "p6rule" + null rulesub + + rulesub = p6rule_compile(pattern) + match = rulesub(x) + match_result: + unless match goto match_fail + out = "Just [" + $S0 = match."dump_hs"() + concat out, $S0 + concat out, "]\n" + goto end_match + match_fail: + out = "Nothing\n" + goto end_match + end_match: + .return (out) +.end + +.namespace [ "PGE::Match" ] + +.sub "dump_hs" method + .local pmc capt + .local int spi, spc + .local pmc iter + .local string escaped + .local pmc escape + .local string out + + out = "" + + unless argcS < 3 goto start + unless argcS < 2 goto start + start: + escape = find_global "Data::Escape", "String" + $I0 = self + unless $I0 goto subpats + $S0 = self + escaped = escape($S0) + $I0 = self."from"() + $S0 = $I0 + concat out, "(" + concat out, $S0 + concat out, ", \"" + concat out, escaped + concat out, "\")" + + subpats: + $I0 = self + capt = getattribute self, "PGE::Match\x0@:capt" + isnull capt, subrules + spi = 0 + spc = elements capt + subpats_1: + unless spi < spc goto subrules + $S0 = spi + $I0 = defined capt[spi] + unless $I0 goto subpats_2 + $P0 = capt[spi] + bsr dumper + subpats_2: + inc spi + goto subpats_1 + + subrules: + capt = getattribute self, "PGE::Match\x0%:capt" + isnull capt, end + iter = new Iterator, capt + iter = 0 + subrules_1: + unless iter goto end + $S0 = shift iter + $I0 = defined capt[$S0] + unless $I0 goto subrules_1 + $P0 = capt[$S0] + bsr dumper + goto subrules_1 + + dumper: + $I0 = 0 + $I1 = elements $P0 + unless $I0 < $I1 goto dumper_1 + $P1 = getprop "isarray", $P0 + if $P1 goto dumper_2 + $P1 = $P0[-1] + concat out, ", " + $S0 = $P1."dump_hs"() + concat out, $S0 + dumper_1: + ret + dumper_2: + unless $I0 < $I1 goto dumper_1 + $P1 = $P0[$I0] + concat out, ", " + $S0 = $P1."dump_hs"() + concat out, $S0 + inc $I0 + goto dumper_2 + end: + .return (out) +.end === PGE.pir ================================================================== --- PGE.pir (revision 8010) +++ PGE.pir (patch - level 1) @@ -25,9 +25,12 @@ load() load = find_global "PGE::P6Rule", "__onload" load() + load = find_global "PGE::Hs", "__onload" + load() .end .include "PGE/TokenHash.pir" .include "PGE/Exp.pir" .include "PGE/Match.pir" .include "PGE/P6Rule.pir" +.include "PGE/Hs.pir" ==== BEGIN SVK PATCH BLOCK ==== Version: svk 0.994 (freebsd) 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 Km7oerlIcwxdxOymWtSZCnwChWxyOvkX2ivcGA== ==== END SVK PATCH BLOCK ====
pgpt2YJZQPe3P.pgp
Description: PGP signature