24 Stimmen

Wie schreibt man einen Linter?

In meiner täglichen Arbeit schreiben ich und andere in meinem Team eine Menge Hardwaremodelle in Verilog-AMS, einer Sprache, die hauptsächlich von kommerziellen Anbietern und einigen Open-Source-Simulatorprojekten unterstützt wird. Eine Sache, die die gegenseitige Unterstützung des Codes hilfreicher machen würde, wäre ein LINTER, der unseren Code auf gemeinsame Probleme überprüft und dabei hilft, einen gemeinsamen Code-Formatierungsstil durchzusetzen. Ich möchte natürlich in der Lage sein, meine eigenen Regeln hinzuzufügen und sie, nachdem ich ihren Nutzen für mich selbst bewiesen habe, an den Rest des Teams weiterzugeben. Es macht mir nichts aus, die anfallende Arbeit zu erledigen, aber ich möchte natürlich auch die Arbeit anderer bestehender Projekte nutzen.

Hat die erlaubte Sprachsyntax in einem Yacc- oder Bison-Format mir einen Vorteil verschafft? Oder sollte ich einfach jede Sprachanweisung in eine Perl-Zeichenkette saugen und Mustervergleiche verwenden, um die Dinge zu finden, die ich nicht mag?

(Die meisten Syntax- und Kompilierungsfehler werden von den kommerziellen Tools leicht erkannt, aber wir haben einige eigene Erweiterungen).

19voto

Matt J Punkte 41229

Lex/flex und yacc/bison bieten einfach zu bedienende, gut verstandene Lexer- und Parser-Generatoren, und ich würde wirklich empfehlen, so etwas zu tun, anstatt es prozedural in z.B. Perl zu tun. Reguläre Ausdrücke sind ein mächtiges Werkzeug, um Zeichenketten mit relativ, aber nicht völlig fester Struktur zu zerlegen. Bei jeder echten Programmiersprache wird die Größe des Zustandsautomaten einfach unüberschaubar, wenn man nicht gerade einen Real Lexer/Parser (tm) einsetzt. Stellen Sie sich vor, Sie müssten alle möglichen Verschachtelungen von Schlüsselwörtern, Bezeichnern, Operatoren, fremden Klammern, fremden Semikolons und Kommentaren, die in einer Sprache wie Verilog AMS erlaubt sind, allein mit regulären Ausdrücken und prozeduralem Code bewältigen.

Es ist nicht zu leugnen, dass es eine beträchtliche Lernkurve gibt, aber eine Grammatik zu schreiben, die man für Flex und Bison verwenden kann, und etwas Nützliches mit dem Syntaxbaum zu tun, der aus Bison herauskommt, wird eine viel bessere Nutzung Ihrer Zeit sein, als eine Tonne Code für die Verarbeitung von Zeichenketten in Sonderfällen zu schreiben, die natürlicher mit einem Syntaxbaum in erster Linie behandelt wird. Außerdem wird das, was Sie auf diese Weise lernen, Ihre Fähigkeiten auf eine Art und Weise erweitern, wie es beim Schreiben von Perl-Code nicht der Fall ist, wenn Sie also die Mittel dazu haben, kann ich es nur empfehlen ;-)

Wenn Sie zu faul sind, können Sie sich auch die Eclipse-Plugins ansehen, die Syntaxhervorhebung und grundlegendes Refactoring für Verilog und VHDL ermöglichen. Sie sind in einem unglaublich primitiven Zustand, als ich das letzte Mal nachgeschaut habe, aber sie könnten einige der Codes enthalten, nach denen Sie suchen, oder zumindest einen Basiscode, den Sie sich anschauen können, um Ihren Ansatz beim Entwickeln Ihres eigenen besser zu verstehen.

2voto

user37248 Punkte 257

Ich habe ein paar Verilog-Parser geschrieben und würde PCCTS/ANTLR empfehlen, wenn Ihre bevorzugte Programmiersprache C/C++/Java ist. Es gibt eine PCCTS/ANTLR Verilog-Grammatik mit denen Sie beginnen können. Mein bevorzugter Parser-Generator ist Zebu das auf Common Lisp basiert.

Die große Aufgabe besteht natürlich darin, alle Linting-Regeln festzulegen. Es ist sinnvoll, eine Art Sprache zu entwickeln, um die Linting-Regeln ebenfalls zu spezifizieren.

2voto

d3jones Punkte 701

Unterschätzen Sie nicht, wie viel Arbeit in einem Linter steckt. Das Parsen ist der einfache Teil, weil Sie Werkzeuge (bison, flex, ANTLR/PCCTS) haben, um viel davon zu automatisieren.

Aber was passiert, wenn man einen Parser hat? Sie müssen einen semantischen Baum für den Entwurf erstellen. Je nachdem, wie kompliziert Ihre Eingaben sind, müssen Sie den Verilog-AMS-Entwurf ausarbeiten (d. h. Parameter auflösen, Generierungen abwickeln usw.). wenn Sie diese Funktionen verwenden). Und erst dann können Sie versuchen, Regeln zu implementieren.

Ich würde ernsthaft über andere mögliche Lösungen nachdenken, bevor ich einen Linter schreibe, es sei denn, die Zahl der Benutzer und die mögliche Zeitersparnis rechtfertigen die Entwicklungszeit.

0voto

Chris Kimpton Punkte 5438

Auf der Suche nach einer Antwort fand ich dies auf ANTLR - könnte von Nutzen sein

0voto

Chris Kimpton Punkte 5438

Wenn Sie überhaupt Java (und damit IDEA) verwenden, ist die IDE's Erweiterungen für benutzerdefinierte Sprachen könnte von Nutzen sein

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X