2009-03-04 11 views

Antwort

9

Insbesondere Rückreferenzen zum Erfassen von Klammern machen reguläre Ausdrücke komplexer als normale, kontextfreie oder kontextsensitive Grammatiken. Der Name ist einfach historisch gewachsen (so viele Wörter). Siehe auch this section in Wikipedia und dieses explanation with an example von Perl.

+0

Könnten Sie bitte den Unterschied zwischen "regulärer Sprache" und "regulärem Ausdruck" erklären? –

+1

Ist es wirklich mächtiger als CSG? Kannst du ein Beispiel geben? – notnot

+0

Eine reguläre Sprache kann durch eine reguläre Grammatik beschrieben werden (siehe http://en.wikipedia.org/wiki/Regular_grammar), während reguläre Ausdrücke eine Mustersprache sind, die weniger eingeschränkt und daher komplexer zu verarbeiten ist. –

3

So wie ich es sehe:

  • Reguläre Sprachen:
    • von Zustandsmaschinen abgestimmt. Es kann nur eine Variable verwendet werden, um den aktuellen „Ort“ in der Grammatik darstellen zu angepasst werden:
      • durch einen Stapelmaschine Matched: Rekursion kann nicht
    • Kontextfreie Sprachen implementiert werden. Der aktuelle "Ort" in der Grammatik wird durch einen Stapel in der einen oder anderen Form dargestellt. Kann nicht "erinnern" alles, was
  • Kontextsensitive Sprachen vor
  • aufgetreten:
  • Alle Die meisten menschlichen Sprachen

Ich weiß von regelmäßigen

  • Die meisten Programmiersprachen Ausdrucksparser, die es Ihnen ermöglichen, mit etwas zu vergleichen, das der Parser bereits kennengelernt hat, und so etwas wie einen Kontext zu erreichen nsitive Grammatik.

    Dennoch erlauben reguläre Ausdrucksparser, so ausgeklügelt sie auch sein mögen, keine rekursive Anwendung von Regeln, was eine unabdingbare Voraussetzung für kontextfreie Grammatiken ist.

    Der Begriff regex, meiner Meinung nach, bezieht sich vor allem auf die Syntax verwendet, um diese regulären Grammatiken (die Sterne und Fragezeichen) auszudrücken.

+0

Lookahead/Lookbehind und Benennungen fügen definitiv etwas hinzu, das außerhalb von regulären regulären Ausdrücken liegt - Speicher. Sind wir nicht auf PDA-Ebene? – notnot

+1

Es ist im allgemeinen nicht wahr, dass die natürliche Sprache kontextsensitive ist, siehe http://www.eecs.harvard.edu/~shieber/Biblio/Papers/shieber85.pdf –

+0

ah, das ist die guten Sachen – notnot

3

Es gibt Funktionen in modernen Regular Expression-Implementierungen, die die Regeln der classic regular expression definition brechen.

Zum Beispiel Microsoft’s .NET Balancing Group(?<name1-name2> …):

^(?:0(?<L>)|1(?<-L>))*(?(L)(?!))$ 

Diese tut die Sprache entsprechen L ₀₁ = {ε, 01, 0011, 000111, ...}. Aber diese Sprache ist gemäß der Pumping Lemma nicht regelmäßig.

+0

Ich weiß, dass es über den klassischen Regex hinausgeht, aber ich frage mich, wie viel weiter. Fabians Link oben ist interessant. – notnot