Beste Weg, um die tokenisierung und zu analysieren Programmiersprachen in meiner Anwendung
Arbeite ich an einem tool, führen Sie einige einfache Transformationen auf Programme (wie extract method). Um dies zu tun, werde ich haben, führen Sie die ersten Schritte der Kompilierung (tokenisierung, analysieren und eventuell Aufbau einer Symboltabelle). Ich werde mit C beginnen und dann hoffentlich verlängern Sie diese aus, um Unterstützung für mehrere Sprachen.
Meine Frage ist, was ist der beste Weg, um diese Schritte auszuführen, dass:
1.) Nicht das Rad neu erfinden. Klar möchte ich nicht schreiben, Flex/Bison-Spezifikationen von hand. Muss ich nur greifen bereits bestehende Spezifikationen und von dort aus arbeiten? Ist Antlr die Art und Weise, hier zu gehen?
2.) Ist erweiterbar auf mehrere Sprachen. Offensichtlich sind das sogenannte Lexing/parsing wird anders sein für jeden, aber ich möchte eine Lösung, die könnte ich leicht erweitern, um auch andere Sprachen. Mindestens ein Satz von Technologien würde, dass diese überschaubar.
BTW, ich bin mit C zu schreiben, für meine Anwendungen
Wenn jemand eine Idee hat, das wäre toll! Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
hands down, der beste Weg, um zu tun, jede Analyse ist ANTLR. Es gibt zwei tolle Bücher über das Thema, den Autor, das sind must-haves. The Definitive ANTLR Reference: Building Domain-Specific Languages, und Language Implementation Patterns, beide sind wertvolle Ressourcen. ANTLR erzeugen kann, die Verarbeitung von code in vielen verschiedenen Sprachen.
Da wirst du schon geschrieben Grammatiken und regulären Ausdrücken, die Sie Wahl des Tools ist ininfluent.
Können Sie gehen mit flex /bison und finden Sie viele Grammatiken bereits geschrieben. Ansonsten kann man mit ANTLR, der sollte auf C, C++ und Java ohne Probleme und tut das gleiche auch für Sie.
Sie nicht darüber sprechen, welche Sprache verwenden Sie für diese Arbeit, also was darauf hindeutet, ein besserer Ansatz ist nicht so einfach.
Denken über die Tatsache, dass jede Sprache hat Ihre eigenen Merkmale, zum Beispiel die symbol-Tabelle konstruiert, in einer anderen Weise in Ruby im Vergleich zu C++. Das ist,, weil Sie kann strengere oder lockerer Erklärungen und so weiter.. also sollte man gut überlegen, was Sie gehen zu müssen (und Sie kann es erklären, die in Ihrer Frage auch, so kann ich Ihnen besser helfen).
Ihrer zwei Phasen kann ich sagen, dass
Tokenisierung ist ganz einfach, tut nicht erfordern unterschiedliche Strukturen für jede Sprache und kann leicht erweitert werden, um die Unterstützung einer Vielzahl von Programmiersprachen..
Parsen kann schwierig werden. Haben Sie den Aufbau einer Abstract Syntax Tree des Programms und dann tun, was Sie wollen auf Sie. Wenn du es gerne machst OOP-Stil, den Sie verwenden müssen, eine Klasse für jeden Knoten-Typ, aber die node-Typen ändern können zwischen den Sprachen, weil Sie strukturell anders so etwas tun, allgemein und leicht erweiterbar ist auf eine andere Sprache, es ist ziemlich schwierig..
Dieser Punkt ANTLR gewinnt über Bison und Flex, denn Sie bietet eine automatische Generierung von AST (wenn ich mich gut daran erinnern).
Der wesentliche Unterschied zwischen diesen beiden compiler-Compilern ist die Tatsache, dass ANTLR verwendet eine LL(k) parser (das ist der top-down), während Bison verwendet eine LALR(1) das ist bottom-up, aber wenn Sie verwenden bereits geschriebene Grammatiken, sollte nicht so schwierig sein.
Persönliche Beratung: ich schrieb viele Interpreter oder Compiler aber nie angefangen von einer voll ausgestatteten Sprache. C syntax ist wirklich großen vielleicht sollten Sie beginnen, aus einer Teilmenge, dann sehen Sie, was Sie tun können, mit Token und AST und später erweitern, um volle Unterstützung der syntax.
Welcher Sprache schreibst du dein Programm?
Ich würde gehen mit antlr (und eigentlich gehe ich für die Analyse von Java). Es unterstützt eine Menge von Sprachen, und hat auch eine Menge von Beispiel-Grammatiken, die Sie kostenlos erhalten,http://www.antlr.org/grammar/list. Leider sind Sie nicht perfekt sein (das Java-Grammatik hat keine AST-Regeln), aber Sie geben Ihnen einen guten start und ich denke, die community ist ziemlich groß für einen parser-generator.
Die große Sache mit antlr-abgesehen von den vielen Sprache Ziele ist, dass LL(*) combinded mit dem Prädikate unterstützt antlr ist sehr leistungsfähig, einfach zu verstehen und die erzeugten Parser sind auch.
Mit "erweiterbar auf mehrere Sprachen" ich nehme an, du meinst mehrere Ausgangssprachen. Dies ist nicht einfach, aber ich nehme an, Sie haben vielleicht einige Erfolg beim übersetzen Ihnen ASTs, haben so viel gemeinsame Symbole wie möglich und schreiben Sie eine Allgemeine tree walker, der kann die Unterschiede in den Sprachen. Aber das könnte ziemlich schwierig sein.
Seien Sie gewarnt, obwohl, dass die online-Dokumentation ist nur gut, wenn Sie gelesen haben das offizielle antlr-buchen und verstehen, LL(*) und semantischen und syntaktischen Prädikaten.
Du nicht eine Sprache festlegen, so dass ich nur empfehlen dieses kleine Juwel fand ich den anderen Tag:
http://irony.codeplex.com/
Es ist super einfach zu bedienen, und hat sogar Grammatiken pre-gebaut für verschiedene Sprachen (C# auch). Es gibt auch pyparsing (http://pyparsing.wikispaces.com/) wenn Sie möchten, dass die Verwendung von Python als Ausgangssprache.
Einer Tür durch zu gehen, ist Eclipse. Es hat Analyse, einschließlich Fehler-tolerant-Analyse, für eine Vielzahl von Sprachen. Eclipse hat eine interne Modularität, die ermöglicht die Ausnutzung dieser Funktionalität, ohne Berührung der IDE.