Ich möchte lernen, wie man eine abstrakte Syntax-Struktur für verschachtelte Tupel mit einem Perl Regexp mit eingebetteten Code-Ausführung erstellen. Ich kann das leicht mit einer Perl 6-Grammatik programmieren, und mir ist klar, dass die Verwendung von Parsing-Modulen die Aufgabe in Perl 5 vereinfachen würde, aber ich denke, dass ich für solche einfachen Aufgaben ohne Module lernen könnte, wie man maschinell übersetzt Grammatikdefinitionen. Ich konnte keinen Weg zur Dereferenzierung von $^R finden, also versuche ich die unfreiwillige Verschachtelung am Ende der TUPLE-Regeldefinition rückgängig zu machen, aber die Ausgabe ist inkorrekt, z. Einige Teilstrings erscheinen zweimal.
use v5.10;
use Data::Dumper;
while (<DATA>) {
chomp;
/(?&TUPLE)(?{$a = $^R})
(?(DEFINE)
(?<TUPLE>
T \s (?&ELEM) \s (?&ELEM)
(?{ [$^R->[0][0],[$^R->[0][1],$^R[1]]] })
)
(?<ELEM>
(?: (a) (?{ [$^R,$^N] }) | \((?&TUPLE) \))
)
)/x;
say Dumper $a;
}
__DATA__
T a a
T (T a a) a
T a (T a a)
T (T a a) (T a a)
T (T (T a a) a) (T a (T a a))
Erwartete Ausgangsdatenstruktur ist eine verschachtelte Liste:
['a','a'];
['a',['a','a']];
[['a','a'],'a'];
[['a','a'],['a','a']];
[[['a','a'],'a'],['a',['a','a']]]
Als Referenz ich auch Perl 6 Code arbeiten meine teilen werden: um herauszufinden,
grammar Tuple {
token TOP { 'T ' <elem> ' ' <elem> }
token elem { 'a' | '(' <TOP> ')'}
}
class Actions {
method TOP($/) {make ($<elem>[0].made, $<elem>[1].made)}
method elem($/) {make $<TOP> ?? $<TOP>.made !! 'a'}
}
Cool, schreiben Sie es so macht es einfacher. Warum übergeben Sie den String-Parameter als Referenz in parse_tuple? – rubystallion
@rubystallion Da das aktuelle 'pos', wo die' \ G'-Anker Teil des String-Wertes sind, dürfen wir keine Kopie machen (oder wir müssten 'pos' in jedem Sub erneut zuweisen). Beachten Sie, dass 'parse_element()' die Suche fortsetzen kann, wobei 'parse_tuple()' beendet ist, weil '$ ref 'die richtige Position hat. Kopien werden auch für größere Dokumente ineffizient. – amon
Ich denke, das ist einer jener Orte, an denen es sinnvoll wäre, '$ _' anstelle eines Parameters zu verwenden. – ikegami