2016-06-17 12 views
2

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

+0

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. –

+0

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. –

Antwort

0

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

+0

Danke, aber ich bin mir nicht sicher, wo ich anfangen soll ist meine Hauptsorge jetzt – user5440565

+0

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. –

+0

Ich habe schon eine Grammatur für so etwas. d.h. '* Ausdruck :: = Identifikator | IntegerValue | BooleanExpression * Bezeichner :: = * IntegerValue :: = * BooleanExpression :: = BooleanBinaryExpression | BooleanUnaryExpression | TrueExpression | FalseExpression * BooleanBinaryExpression :: = AndExpression | EqualsExpression * AndExpression :: = Ausdruck '&&' Ausdruck * EqualsExpression :: = Ausdruck '==' Ausdruck * BooleanUnaryExpression :: = DefinedExpression * DefinedExpression :: = 'definiert' '(' Identifier ')' ' – user5440565