Ich bin neu in C#. Ich habe eine Frage zum Parsen einer Zeichenfolge. Wenn ich eine Datei habe, die Dome-Linien wie PC: SWITCH_A == ON
oder eine Zeichenfolge wie PC: defined(SWITCH_B) && SWITCH_C == OFF
enthält. Alle Operatoren (==, & &, definiert) sind hier ein String und alle Switch-Namen (SWITCH_A) und ihre Werte sind Bezeichner (OFF). Wie analysiere ich diese Art von String? Muss ich sie zuerst tokenisieren, sie durch neue Zeilen oder Leerstellen aufteilen und dann einen abstrakten Syntaxbaum für ihre Analyse erstellen? Muss ich zuerst alle Kennungen in einem Wörterbuch speichern? Ich habe keine Ahnung von Parsing Kann mir jemand helfen? Und erzähle mir mit einem Beispiel, wie man es macht, was sollten die Methoden und Klassen sein, die enthalten sein sollten? Vielen Dank.wie ein Ausdruck Schritt für Schritt in C# (vorzugsweise Besucher Muster) zu analysieren
Antwort
Leider, ja. Sie müssen sie in Token zerlegen, wenn die Syntax, die Sie analysieren, etwas Brauchbares ist und keine Standard-Syntax, in der ein Compiler bereits existiert, um die Quelle zu analysieren.
Sie könnten Expression Trees nutzen. Sie sind dort in .NET Framework zum Erstellen und Auswerten von dynamischen Sprachen.
Um mit der Analyse der Syntax zu beginnen, müssen Sie ein Grammatikdokument haben, das alle möglichen Fälle der Syntax in jeder Zeile beschreibt. Danach können Sie die Zeilen analysieren und Ihren Ausdrucksbaum erstellen.
Das Parsen eines Quellcodes erfolgt normalerweise jeweils ein Zeichen, da jedes Zeichen die gesamte Semantik des zu analysierenden Stücks ändern kann.
Also, ich schlage vor, Sie beginnen mit einem Grammatikdokument für die Syntax, die Sie haben und dann beginnen, Ihren Parser zu schreiben.
Vergewissern Sie sich, dass es schon da nichts ist außer für die Syntax, die Sie versuchen, da diese Art von Projekten zu analysieren neigen fehleranfällig und zeitraubend
Nun, da Ihre High-Level-Grammatik zu sein ist
Ausdruck :: = Bezeichner | IntegerValue | BoolescherAusdruck
Identifier
und IntegerValue
konstant sind Literale in der Quelle, so müssen Sie für eine BooleanExpression
Suche starten.
Um ein BooleanExpression
notwendigen Informationen für entweder BooleanBinaryExpression
, BooleanUnaryExpression
, TrueExpression
oder FalseExpression
zu suchen.
Sie können eine BooleanBinaryExpression
erkennen, indem Sie nach den Operatoren &&
oder ==
suchen und dann die linken und rechten Operanden verwenden.
Um eine BooleanUnaryExpression
zu finden, müssen Sie nach dem Wort defined
suchen und dann den Bezeichner in den Klammern analysieren.
Und so weiter ...
Beachten Sie, dass Ihre Grammatik Rekursion in der Syntax unterstützt, Blick auf die Definition des AndExpression
oder EqualsExpression
, weisen sie zurück zu Expression
AndExpression :: = Ausdruck '& &' Expression
EqualsExpression :: = Ausdruck '==' Ausdruck
Sie haben eine Reihe von Methoden in der String Class im .NET Framework, um Sie bei der Erkennung und Analyse Ihrer Grammatik zu unterstützen.
Eine andere Alternative ist, dass Sie nach einem Parsergenerator suchen können, der auf C# abzielt. Siehe beispielsweise ANTLR
Danke, aber ich bin mir nicht sicher, wo ich anfangen soll ist meine Hauptsorge jetzt – user5440565
Beginnen Sie mit der Suche nach einem Dokument, das alle möglichen Fälle für die Syntax in jeder Zeile beschreibt, falls Sie es nicht wissen. Wenn Sie wissen, können Sie mit dem Schreiben Ihres Parsers beginnen. –
Ich habe schon eine Grammatur für so etwas. d.h. '* Ausdruck :: = Identifikator | IntegerValue | BooleanExpression * Bezeichner :: =
Wenn die Zeilen einigermaßen konsistent sind, besteht die einfachste Möglichkeit darin, jede Zeile einzulesen und dann eine Zeichenfolge auszuführen.Split (''). Dies gibt Ihnen ein Array von Strings zurück, die Sie entsprechend parsen können. –
Siehe meine SO-Antwort, wie man einen rekursiven Abstiegsparser von Hand baut. http://stackoverflow.com/questions/2245962/is-there-a-alternative-for-flex-bison-that-is-usable-on-8-bit-embedded-systems/2336769#2336769 Dies ist ziemlich einfach für Ausdrücke. –