Ich möchte einen von einem Benutzer eingegebenen regulären Ausdruck in einen NFA konvertieren, damit ich den NFA dann zu Übereinstimmungszwecken für eine Zeichenfolge ausführen kann. Was ist die minimale Maschine, die verwendet werden kann, um reguläre Ausdrücke zu analysieren?
Ich gehe davon aus, dass es sich um einen Push-Down-Automaten handeln muss, da das Vorhandensein von Klammern eine Zählung erforderlich macht und ein DFA / NFA keine willkürliche Zählung durchführen kann. Ist diese Annahme richtig? Zum Beispiel würde der Ausdruck a (bc *) d einen PDA erfordern, damit der Unterausdruck in Klammern korrekt behandelt wird.
Antworten:
Du hast Recht. Es ist leicht zu zeigen, dass die Syntax regulärer Ausdrücke mit Standardtechniken nicht regulär ist .
Allerdings möchten Sie wahrscheinlich keinen PDA von Hand codieren. Erwägen Sie die Verwendung eines Parser-Generators wie ANTLR oder byacc . Wenn Sie andererseits das Parsen von Sprachen untersuchen möchten, indem Sie Parser selbst programmieren, sollten Sie mit anderen grundlegenden Parsing-Algorithmen wie CYK , Earley , rekursiver Abstieg und LR fortfahren .
quelle
Ich schlage vor, die schöne Antwort von Jukka auf die Frage " Übereinstimmende reguläre Ausdrücke mit regulären Ausdrücken " auf cstheory zu lesen. Ein Ausschnitt:
Dies ist nur ein Link zu einer interessanten (meiner Meinung nach) "anderen Sichtweise" auf die Sprache des regulären Ausdrucks; Wie in den Kommentaren unten unterstrichen, ist es nicht nützlich, um einen Syntaxbaum zu erstellen. Wenn Sie Ihren Parser aus der Hand geben möchten, empfehle ich Ihnen diesen einfachen Artikel über das Codeprojekt " Schreiben eines eigenen Parsers für reguläre Ausdrücke ".
quelle