2013-02-08 11 views
15

Ich werde einen Parser der Verilog (oder VHDL) Sprache schreiben und wird eine Menge Manipulationen (Art von Transformationen) der geparsten Daten. Ich beabsichtige, wirklich große Dateien zu parsen (vollständige Verilog-Designs, so groß wie 10K-Zeilen), und ich werde letztendlich den Großteil des Verilogs unterstützen. Es macht mir nichts aus, zu tippen, aber ich möchte keinen Teil des Codes neu schreiben, wenn ich Unterstützung für eine andere Regel hinzufüge.Parsec oder glücklich (mit alex) oder uu-parsinglib

In Haskell, welche Bibliothek würden Sie empfehlen? Ich kenne Haskell und habe schon Happy benutzt (zu spielen). Ich denke, es gibt Möglichkeiten, Parsec für die Umwandlung der geparsten Zeichenfolge in den Code zu verwenden (was ein großes Plus ist). Ich habe keine Erfahrung mit Uu-Paringlib.

Also, um eine vollständige Grammatik von Verilog/VHDL zu analysieren, welche von denen wird empfohlen? Mein Hauptanliegen ist die Leichtigkeit und "Korrektheit", mit der ich die geparsten Daten nach meiner Laune manipulieren kann. Geschwindigkeit ist kein vorrangiges Anliegen.

+0

Dies ist ein riesiges Projekt. Ein Verilog-Parser ist sehr kompliziert. –

+4

Ja, tatsächlich. Einen Teil von Verilog zu unterstützen ist gut genug, um zu zeigen, dass ich während meiner Promotion mit Verilog arbeiten möchte. aber ich möchte das auch nach meinem Ph.D. Es ist also eine wirklich langfristige Investition. Ich möchte wissen, ob Haskell der Rechnung entspricht. Ich liebe diese Sprache. – Dilawar

+1

Was haben Sie am Ende gemacht? Bist du glücklich mit deiner Wahl? – Schiavini

Antwort

19

Ich persönlich bevorzuge Parsec mit Hilfe von Alex für Lexing.

Ich bevorzuge Parsec über Happy, weil 1) Parsec eine Bibliothek ist, während Happy ein Programm ist und Sie in einer anderen Sprache schreiben, wenn Sie Happy verwenden und dann mit Happy kompilieren. 2) Parsec bietet dank seiner monadischen Schnittstelle kontextsensitive Analysefunktionen. Sie können den zusätzlichen Status für das kontextsensitive Parsing verwenden und dann abhängig von diesem Status prüfen und entscheiden. Oder schauen Sie sich zuerst einen geparsten Wert an und entscheiden Sie sich für die nächsten Parser etc. (wie a <- parseSomething; if test a then ... do ...) Und wenn Sie keine kontextsensitiven Informationen benötigen, können Sie einfach den anwendungsspezifischen Stil verwenden und eine Implementierung wie in YACC oder einem ähnlichen Tool implementieren . Als Nachteil von Parsec wissen Sie nie, ob Ihr Parsec-Parser eine linke Rekursion enthält, und Ihr Parser bleibt in der Laufzeit stecken (weil Parsec im Grunde ein rekursiver Descending-Parser von oben nach unten ist). Sie müssen linke Rekursionen finden und sie beseitigen. YACC-artige Parser können Ihnen statische Garantien und Informationen geben (wie Verschiebungs-/Reduzierungskonflikte, ungenutzte Terminals usw.), die Sie nicht mit Parsec erhalten können.

Alex hoch für lexing in beiden Situationen empfohlen ( Ich glaube, Sie zu Verwendung Alex haben, wenn Sie bei Happy weiter zu gehen entscheiden). Denn selbst wenn Sie Parsec verwenden, vereinfacht dies Ihre Parserimplementierung und fängt auch eine Menge Fehler ab (zum Beispiel: das Parsen eines Schlüsselwortes als Bezeichner war ein häufiger Fehler, den ich bei der Verwendung von Parsec ohne Alex gemacht habe.) Es ist nur ein Beispiel).

Sie können sehen, meine Lua parser in Alex + Parsec implementiert Und hier ist die code to use Alex-generated tokens in Parsec.

EDIT: Danke John L für Korrekturen. Anscheinend können Sie mit Happy auch kontextsensitives Parsen durchführen. Außerdem ist Alex für Lexing in Happy nicht erforderlich, obwohl es empfohlen wird.

+0

Vielen Dank für Ihren Lua-Parser. Es ist hilfreich, Alex persönlich zu sehen, und nicht nur einige Spielzeugbeispiele aus der Dokumentation. –

+0

+1 für die Freigabe Ihrer Arbeit. – Dilawar

+4

Viele der Details bezüglich Happy in dieser Antwort sind falsch.Happy unterstützt das kontextsensitive Parsing (da Parser in beliebigen Monaden ausgeführt werden können). Happy braucht Alex nicht, du könntest jeden Lexer benutzen. Sie könnten sogar direkt in Happy den Unterricht machen, obwohl das nicht zu empfehlen wäre. –