2016-09-18 3 views
1

Ich lerne kürzlich Compiler-Prinzipien. Ich bemerke, dass alle Beispiele aus Lehrbüchern einen Lexikalparser beschreiben, der "lex" oder "flex" mit regulären Ausdrücken verwendet, um zu zeigen, wie Eingabequelldateien analysiert werden.Regulärer Ausdruck kann verwendet werden, um alle Arten von lexikalischen Parser-Anforderungen auszudrücken?

Gibt es an, dass alle bekannten Programmiersprachen unter Verwendung der Grammatik vom Typ 3 implementiert werden können, um lexikalisches Parsen durchzuführen? Oder nur Textbücher verwenden einfache Beispiele, um Ideen zu zeigen?

Antwort

1

Die meisten Lexeme in den meisten Sprachen können mit regulären Ausdrücken identifiziert werden, aber es gibt Ausnahmen. (Wenn es um das Parsen von Computersprachen geht, gibt es immer Ausnahmen. Ohne Ausnahme.)

Zum Beispiel können Sie ein C++ - Raw-String-Literal nicht mit einer Regex abgleichen. Ohne syntaktische Analyse können Sie nicht sagen, ob /= in einem JavaScript-Programm das einzelne Lexem ist, das zum Teilen und Zuweisen verwendet wird, oder ob es der Anfang eines regulären Ausdrucks ist, der mit einem String übereinstimmt, der mit = beginnt. Sprachen, die verschachtelte Kommentare zulassen (im Gegensatz zu C), erfordern etwas, das etwas leistungsfähiger ist.

Aber es ist enorm einfacher, ein paar Regexes zu schreiben, als eine vollständige Zustandsmaschine in rohem C zu schreiben, also gibt es eine Menge Motivation, Flex für einige Ausnahmefälle nach eigenem Willen zu biegen. Und Flex arbeitet in gewissem Maße mit Funktionen zusammen, die es ermöglichen, bei Bedarf aus der Regex-Zwangsjacke zu entkommen. In einer erweiterten Klasse zur lexikalischen Analyse erfahren Sie mehr über diese Funktionen.

Verwandte Themen