2009-05-06 4 views
3

Ich habe als Eingabetextblocks mit Befehlen und Argumenten, einem pro Zeile, wieBeste moderne Textparsing? AKA Wann benutzt man Lex und Yacc?

XYZ ARG1,ARG2,ARG3,...,ARGN 

Und ich möchte, um zu überprüfen, dass die Argumente zu XYZ gut für diesen bestimmten Befehl gebildet werden und führen Sie den richtigen Block Code, wenn sie sind. Es gibt so etwas wie ~ 100 Befehle, von denen einige eine variable Anzahl von Argumenten haben, verschiedene Beziehungen (d. H., Wenn der Befehl XYZ aufgerufen wurde, dann muss auch der Befehl ABC aufgerufen werden).

auch Befehle existieren, wie:

COMMAND 
XYZ ARG1 
BEF ARG1 ARG2 
ENDCOMMAND 

Es ist wichtig, dass der Text innerhalb COMMAND und ENDCOMMAND enthalten ist.

Normalerweise würde ich Lex und Yacc anstelle von Regex verwenden, aber gibt es etwas moderneres? Der Code ist in C# geschrieben. Gibt es etwas in MSDN, das dies tut, anstatt C-Lex und Yacc der alten Schule?

Antwort

1

Sie haben ein größeres Problem als "Alter", in dem ich nicht sicher bin, dass irgendeiner der großen bekannten C-ish Compiler-Compiler mit C# arbeiten wird. Dasselbe gilt für Boosts neumodische Parsing-Templates.

Sie wahrscheinlich mit etwas esoterisch wie Grammatica oder Spart gehen zu müssen gehen

EDIT (auf meine beiden besten Google hits holen): Nach etwas mehr suchen, scheint es, dass ANTLR Unterstützung für C# hat. ANTLR ist sehr bekannt und viel neuer als LEX/YACC, also würde ich vorschlagen, es zu überprüfen.

+0

Hmm Ich denke, Sie sind falsch. Ich hätte nur meine C-Parsing-Bibliothek, eine C# -Wrapper-Bibliothek und meine C# -Anwendung. –

+0

Funktioniert das nicht?Danke für die Antwort, aber bitte sag mir, warum das nicht funktioniert. Danke noch einmal. –

+0

Ah ja, Sie könnten tatsächlich den Parser in C machen und ihn mit C# umhüllen. Angenommen, Sie können eine VisualStudio-kompatible Version von LEX/YACC finden. Die Prebuilt von Gnu verwenden generell die Gnu-Bibliotheksformate und benötigen den Gnu-Linker (ld). –

0

Es gibt keine spezielle Sache im .NET Framework, wenn Sie das meinen.

Auf den ersten Blick sieht Ihre Befehlsstruktur relativ einfach aus, so dass manuelles Parsing hier gut geeignet wäre und es fast immer die schnellste Lösung ist. Dies ermöglicht Ihnen auch, die tatsächlichen Werte der Befehlsargumente auf Korrektheit zu überprüfen und nicht nur auf ihre Syntaxgültigkeit.

5

Wenn Sie nach einer Alternative zu Lex/Yacc suchen, besuchen Sie ANTLR. Es unterstützt die Codegenerierung in einer Vielzahl von Sprachen, including C#.

+0

Ick. Du hast das gepostet, während ich dasselbe gepostet habe. Meine allgemeine Politik, wenn solche Dinge passieren, ist, dass Sie (der Duper) eindeutig ein Genie sind, und somit eine Aufwertung verdienen. :-) –

+0

Hehe, großartige Köpfe denken gleich. ;) Danke! –

4

ANTLR kann sowohl mit Lexing als auch mit Parsing umgehen und es kann C# generieren (zusätzlich zu Java, C++ und Python). Es ist sehr reif, hat viele Dokumente und viele Beispiele. Es erzeugt auch viel schönere Fehlermeldungen, die YACC.

+0

Gleicher Kommentar wie bei Ayman. –

1

Für ein einfaches Parsing-Problem wie dieses können Sie einen rekursiven Descent-Parser schreiben. Angenommen, Ihre Sprache ist relativ fest und wird nicht zu einer vollständigen Programmiersprache. Wenn die Gefahr besteht, beißen Sie in die Kugel und verwenden Sie ANTLR oder ein gleichwertiges Mittel.

Verwandte Themen