2015-12-13 14 views
5

fand ich eine Tilde ~ in diesem Config::INI Perl 6 Grammar:Was bedeutet ~ in einer Grammatik (in Perl 6)?

token header { ^^ \h* '[' ~ ']' $<text>=<-[ \] \n ]>+ \h* <.eol>+ } 

Es gibt keine Tilden ~ im Text I Verarbeitung bin. Ich weiß, dass '[' ~ ']' ist wichtig, weil das Auslassen eines oder aller '[', ~ und macht die Grammatik nicht mehr mit meinem Text übereinstimmen.

Da ich wusste, was das Muster war, dass ich passend, ich habe es geändert, so dass die eckigen Klammern um den Textausdruck waren, also:

token header { ^^ \h* '[' $<text>=<-[ \] \n ]>+ ']' \h* <.eol>+ } 

mir So scheint es, dass '[' ~ ']' wirklich Spiel sagen wird eine eckige Klammer hier und erwarte die schließende Klammer danach.

Wie auch immer, ich weiß, dass in der normalen Perl 6-Syntax die Tilde ~ zum Verketten von Strings verwendet wird. Aber das bedeutet offensichtlich etwas anderes in this Grammar. (In Perl 6 können Sie mit Hilfe von Grammatiken komplizierte Datenstrukturen aus Text extrahieren. Sie sind wie reguläre Ausdrücke, die auf die nächste Ebene gebracht werden.).

Wie dem auch sei, suchte ich die documentation für Grammars und für Regular Expressions für einen einzelnen ~, aber ich habe nicht in einer Grammatik noch in einem regulären Ausdruck finden.


cross posted on StackOverflow en español

+1

Ich vergesse diese Funktion immer wieder. –

+2

http://design.perl6.org/S05.html#line_876 – Christoph

Antwort

6

Sie können eine Erklärung in den Konstruktionsunterlagen finden Sie hier: https://github.com/perl6/roast/blob/master/S05-metachars/tilde.t#L6-L81

Es meistens tut, was Sie entdeckt: ersetzt die Tilde mit dem Ausdruck, der die rechte Klammer folgt, und sucht nach es zwischen den Klammerzeichen. Es fügt jedoch einige zusätzliche Magie hinzu, um dem Ausdruck zu helfen, die abschließende Klammer zu erkennen und eine nützlichere Fehlermeldung zu liefern, wenn die letzte Klammer nicht gefunden wird. So werden Sie in der Regel bekommen die gleichen Ergebnisse tun es in beide Richtungen, aber nicht immer.