Die Anerkennung der macht der "moderne" regexes
Welche Klasse von Sprachen, für die wirkliche moderne regexes eigentlich erkennen?
Wann immer es gibt eine unbegrenzte Länge erfassende Gruppe mit einem back-Referenz (z.B. (.*)_\1
) ein regex ist jetzt matching eine nicht-reguläre Sprache. Aber dies alleine ist nicht genug, zu entsprechen, so etwas wie S ::= '(' S ')' | ε
— Kontext-freie Sprache von passenden Paare von Klammern.
Rekursive regexes (die sind mir neu, aber ich bin sicher existieren in Perl und PCRE) erkennt zumindest die meisten Energiesparlampen.
Hat jemand gemacht, oder Lesen Sie keine Forschung in diesem Bereich? Was sind die Einschränkungen dieser "modernen" regexes? Erkennen Sie streng mehr oder weniger streng als die CFGs, LL-oder LR-Grammatiken? Oder tun es existieren beide Sprachen erkannt werden kann durch ein regex aber nicht eine CFG und das Gegenteil?
Links zu relevanten Papiere wäre sehr geschätzt werden.
- Ich weiß nicht, einer formellen Arbeit, in der die Berechenbarkeit Klasse der Probleme, die lösbar durch rekursive Muster. Ich weiß, dass Ihre rekursive Produktion oben ist ziemlich leicht genug, kodiert als eine rekursive Muster in PCRE oder Perl.
- Wäre das besser geeignet, um cstheory.stackexchange.com ?
- Möchten Sie vielleicht einen Blick auf diese links (sind alle von der Perl-community, sondern enthalten auch nützliche Informationen): perl.plover.com/yak/regex/samples/slide083.html perlmonks.org/?node_id=660316 perlmonks.org/?node_id=308283
- ich weiß nicht wirklich halten dies für eine "Forschung-level-Frage", wie es wahrscheinlich ist, gewesen getan zu Tode... ich könnte versuchen, stellen Sie es dort, wenn ich nicht alles hören...
- Nur damit alle informiert sind... nur die 2. Referenz die Sie gab, deckt rekursive regexes mit Gruppe Rekursion statt über den code einfügt, das ist schade, weil die 3. ref ist die Art von Diskussion, die @tobyodavies sucht. Jedoch, es könnte immer noch gelten.
- sicher, aber es ist eine theoretische Frage, und die Gemeinschaft an cstheory ist eine viel speziellere Zielgruppe. Es Lautstärke ist auch niedriger, so dass es weniger Chancen, Ihre Frage verloren zu gehen in der Flut von leichter beantwortbar lieben. Ich will einfach nur, um zu sehen, Ihre Frage eine Antwort bekommen.
- Alter post, aber ich habe nach diesem link mehrmals: nikic.github.io/2012/06/15/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Muster Rekursion
Mit rekursiven Muster, Sie haben eine form der rekursiven Abstieg passenden.
Dies ist gut für eine Vielzahl von Problemen, aber wenn Sie wollen, um tatsächlich rekursiven Abstieg Analyse, müssen Sie legen Sie die capture-Gruppen hier und dort, und es ist umständlich, zum wiederherstellen der vollen parse-Struktur in dieser Weise. Damian Conway ist Regexp::Grammars - Modul für Perl verwandelt das einfache Muster in eine äquivalente ein, dass automatisch alle, die benannte Aufnahme in eine rekursive Datenstruktur, so dass für viel einfacher Abruf der analysierten Struktur. Ich habe eine Probe vergleicht man diese beiden Ansätze am Ende dieses Postings.
Einschränkungen der Rekursion
War die Frage, welche Arten von Grammatiken, rekursive Muster zuordnen kann. Nun, Sie sind sicherlich rekursiver Abstieg Typ Matcher. Das einzige, was mir einfällt, ist, dass rekursive Muster nicht in den Griff Links-Rekursion. Dies stellt eine Einschränkung auf die Arten von Grammatiken, die Sie anwenden können, Sie. Manchmal können Sie neu anordnen, Ihre Produktionen zu eliminieren Links-Rekursion.
BTW, PCRE und Perl unterscheiden sich geringfügig, wie Sie sind, erlaubt Satz der Rekursion. Siehe Abschnitt "RECURSIVE PATTERNS" und "Rekursion Unterschied von Perl" in der pcrepattern manpage. zB: Perl verarbeiten kann
^(.|(.)(?1)\2)$
wo PCRE erfordert^((.)(?1)\2|.)$
statt.Rekursion Demos
Die Notwendigkeit für rekursive Muster entsteht, überraschend Häufig. Ein gut besuchter Beispiel ist, wenn Sie benötigen, zu entsprechen, etwas, das nest, wie ausgewogene Klammern, Anführungszeichen, oder auch HTML - /XML-tags. Hier ist das match für balenced parens:
Ich finde, dass es schwieriger zu Lesen, weil seine kompakte Natur. Dies ist leicht heilbar mit
/x
- Modus zu machen whitespace nicht mehr signifikant:Dann wieder, da sind wir mit parens für unsere Rekursion, ein deutlicheres Beispiel wäre passender verschachtelte einfache Anführungszeichen:
Anderen rekursiv definiert, was Sie wünschen können, zu entsprechen, wäre ein Palindrom. Diese einfachen Muster funktioniert in Perl:
dem Sie testen können auf den meisten Systemen mit so etwas wie dieses:
Beachten Sie, dass PCRE ist die Implementierung der Rekursion erfordert aufwändigere
Dies ist wegen der Beschränkungen auf, wie PCRE Rekursion funktioniert.
Ordnungsgemäße Analyse
Mir, die Beispiele oben sind meist Spielzeug, Spiele, nicht alle , dass interessant, wirklich. Interessant wird es dann, wenn Sie eine echte Grammatik versuchen Sie zu analysieren. Zum Beispiel, RFC 5322 definiert einen E-mail-Adresse und nicht aufwändig. Hier ist eine "grammatische" Muster zu entsprechen:
Wie Sie sehen, das ist sehr BNF-like. Das problem ist, es ist nur ein Spiel, nicht ein erfassen. Und Sie wirklich nicht wollen, umgeben Sie das ganze mit der Erfassung parens, da wissen Sie noch nicht, die Produktion abgestimmt, welcher Teil. Mit den zuvor genannten Regexp::Grammars-Modul, das können wir.
Wie Sie sehen, durch die Verwendung leicht unterschiedlicher Schreibweise in das Muster, Sie bekommen jetzt etwas, das speichert die kompletten parse-Baum-Weg für Sie in die
%/
variable, mit der alles säuberlich beschriftet. Das Ergebnis der transformation ist immer noch ein Muster, wie man sehen kann, die=~
Betreiber. Es ist nur ein bisschen Magie.((DEFINE)…)
Idee ist extrem leistungsstarke und nützlich, so dass für die Trennung von Deklaration (und Ihrer Anordnung) von der Ausführung, nur wie alle top-down-Programmierung. Ich kann mich nicht erinnern, die anderen Sprachen haben eine Gruppe Rekursion; es ist vielleicht etwas exotisch, wie C♯ oder seinesgleichen.