2009-03-05 12 views
18

Ich versuche, an einer Art Codegenerator zu arbeiten, um Unit-Testing eines älteren C/C++ - gemischten Projekts zu unterstützen. Ich finde kein unabhängiges Tool kann Stub-Code aus der Deklaration erzeugen. Also entscheide ich mich, eine zu bauen, es sollte nicht so schwer sein.Wo finde ich Standard BNF oder YACC Grammatik für C++ Sprache?

Bitte, jeder kann mir einen Standard Grammatik Link, besser von Yacc Sprache beschrieben.

Hoffe, ich erfinde Rad nicht neu, bitte helfen Sie mir in diesem Fall.

Mit besten Grüßen, Kevin

+0

Um Stub-Code aus einer Deklaration zu generieren, müssen Sie zuerst die Deklaration analysieren. Das bedeutet in der Praxis einen vollständigen C++ Parser. Du willst das wirklich nicht machen. –

Antwort

2

Für eine andere Herangehensweise könnten Sie in Erwägung ziehen, auf einem vorhandenen Compiler zu unterstützen.

GCC-XML wird "C++" in XML-Dateien mit vielen nützlichen Informationen "kompilieren"; es kann für deine Zwecke genug sein.

Leider ist GCC-XML nur 1/4-gepflegt, und es zu arbeiten kann interessant sein. Viel Glück, wenn Sie diesen Weg gehen.

20

Vom C++ FAQ Lite:

38.11 Is there a yacc-able C++ grammar?

Die primäre yacc Grammatik Sie ist von Ed Willink wollen werde. Ed glaubt, seine Grammatik ist vollständig kompatibel mit the ISO/ANSI C++ standard, aber er garantiert es nicht: "Die Grammatik hat nicht", sagt er, "in Wut verwendet worden." Sie können the grammar without action routines oder the grammar with dummy action routines erhalten. Sie können auch the corresponding lexer erhalten. Für diejenigen, die wissen möchten, wie er erreicht einen kontextfreien Parser (durch alle die Mehrdeutigkeiten und eine geringe Anzahl von Reparaturen drängen später getan werden nach dem Parsen abgeschlossen ist), können Sie Kapitel lesen 4 von his thesis.

Es gibt auch eine sehr alte yacc Grammatik , die keine Vorlagen unterstützt, Ausnahmen, noch Namespaces; plus es weicht von der Kernsprache in einige subtile Wege. Sie können diese Grammatik here oder here bekommen.

+2

Wenn Sie wirklich C++ analysieren müssen, brauchen Sie Maschinen, die wirklich funktionieren. "Nicht in Wut verwendet" bedeutet, dass es nicht für echten C++ Code funktioniert. (Ich verstehe nicht, warum diese Antwort so oft favorisiert wurde/upovoted gegeben, wie vollständig unwirksam diese Antwort sein wird). –

+1

@Ira: Meine Vermutung, warum es upvoted ist, ist, dass es wirklich nichts besseres gibt. C++ zu analysieren ist schwer. –

+1

Ira hat Recht. Sie werden wahrscheinlich nur am Ende Ihre Zeit verschwenden. Ich bin ganz dafür, dass du dir dein eigenes baust und in das Kaninchenloch stürzt, wenn du lernen willst. Aber wenn Sie eine Arbeit erledigen wollen, ist es ratsam, etwas zu bekommen, das aus der Box funktioniert. Die DMS-Tools haben weitere Vorteile, da sie eine Reihe von Sprachen abdecken und zusätzliche Funktionen enthalten, die Sie in Ihrem Projekt nützlich finden können. Wenn Ihre Zeit Geld wert ist (d. H. Sie tun es nicht zum Spaß), dann sind die Preise angemessen. –

1

Ich habe vor kurzem this one gefunden. Ich habe es nicht ausprobiert, bin mir also nicht sicher, ob es funktioniert. Können Sie weitere Informationen zu dem Tool geben, das Sie entwickeln möchten? Ich habe diese Grammatik heruntergeladen, weil ich an einem Instrumentierungswerkzeug arbeite, so dass ich Cover-Informationen für meine unit test framework hinzufügen kann.

Nach dem erneuten Lesen Sie Ihren Kommentar ...

Ich denke this tool genau Ihren Bedürfnissen passen.

+0

Ich bin eigentlich an etwas zu arbeiten, was eigentlich gehören ein Unit-Test-Framework. Um eine einzelne Übersetzungseinheit zu testen, muss eine externe Referenz bereitgestellt werden, um eine ausführbare Binärdatei zu erstellen. Daher versuche ich, den Quellcode zu analysieren, um Deklarationen zu finden und eine Stubdefinition zu generieren. –

2

Jareds Link ist einer kontextfreien Grammatik, die man bekommen kann, am nächsten. Bestimmte Dinge müssen für später verzögert werden, aber das ist durch einige Argumente besser als die kontextsensitive Grammatik von C++.

Um die Sache noch schlimmer zu machen, C++ 1x komplexiert die Grammatik erheblich. Um zu einem perfekten Parse von C++ zu kommen, muss ein Parser genug von dem Standard implementieren, um die Überladungsauflösung korrekt durchzuführen, einschließlich der Template-Argumentableitung, die wiederum den Konzeptmechanismus, Lambdas und tatsächlich fast alle von Sprache, außer für zweistufige Namenssuche und Ausnahmespezifikationen, die, wenn ich mich richtig erinnere, keine tatsächliche Implementierung zum erfolgreichen Parsen eines Programms benötigen.

Tatsächlich sind Sie auf halbem Weg zu einem Compiler, wenn Sie C++ analysieren können.

+0

Wenn Sie die Namensauflösung nicht vollständig ausführen können, befinden Sie sich nicht in der Nähe eines C++ - Compilers. Das Parsen ist viel einfacher als die Namensauflösung. –

+1

Nein, weil das Parsen die Namensauflösung erfordert; Das ist mein Punkt. C++ 's Grammatik ist so schlecht. – coppro

+0

C++ Parsing erfordert keine Namensauflösung, wenn Sie einen GLR-Parser verwenden.In der Tat ist es ziemlich einfach und wir tun es jeden Tag mit unserem DMS-Tool (www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html). Wenn Sie darauf bestehen, einen LALR (1) -Parser zu verwenden, der lokale Unklarheiten nicht tolerieren kann, * dann * müssen Sie den Namen bei der Analyse auflösen, und ich stimme zu, dass es ein Durcheinander ist, aber dann gibt es Ihren Grund dafür, dies nicht zu tun. Die Namensauflösung für C++ selbst mit lokalen Mehrdeutigkeiten ist immer noch ziemlich schwierig, werde ich zugeben, aber nicht annähernd so unangenehm, als wenn ich mich mit dem Parser herumschlagen würde. –

1

Unser DMS Software Reengineering Toolkit kann mit einem robusten, voll funktionsfähigen C++ Parser erhalten werden. Siehe http://www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html Dies erstellt ASTs und Symboltabellen und kann den Typ eines Ausdrucks ableiten. DMS ermöglicht es, beliebige Analysen und Transformationen auf dem C++ Code durchzuführen.

Eine "einfache" Transformation ist das Instrumentieren des Codes, um die Testabdeckung zu erfassen Daten; Das bieten wir als COTS-Tool an. Sehen Sie dieses Papier zu verstehen, wie DMS tut es: http://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf

EDIT September 2013 (Diese Antwort war immer ein wenig abgestanden): DMS des C++ Parser/Namensauflösung/Steuerflussanalyse behandelt voll C++ 11, in der ISO-, GNU- und Microsoft-Varianten. Es wird auch den Quellcode parsen (und behalten), der die meisten Präprozessor-Bedingungen enthält. Es hat eine explizite Grammatik , die den Parsing-Prozess antreibt, im Gegensatz zu GCC oder Clang.

+0

Während stackoverflow Open Source- und/oder freie Lösungen nicht direkt bevorzugt oder ablehnt, Im Allgemeinen ist es eine schlechte Idee, einen verschlungenen Link zu setzen, der nicht direkt auf eine Lösung hinweist. Wenn Sie Ihr Tool wirklich bewerben möchten, sollten Sie zumindest auf eine Seite verweisen, auf der einige Beispielcodes und Abhängigkeiten enthalten sind, ohne dass Sie Unternehmens-Klappentexte und ummauerte Download-Links lesen müssen. –

+0

OP sagte, er wollte eine Grammatik, aber sein echtes Problem ist das Parsen von C++, um Informationen zu extrahieren, um Stubs zu generieren. Meine Antwort zeigt, wie man sein wirkliches Problem löst, indem man seine unpraktische Idee einer funktionierenden Grammatik überspringt (sie existieren für herkömmliche Parsergeneratoren praktisch nicht) und dann irgendwie parsen, ohne das Problem der Namensauflösung zu lösen (was eine große Menge an Arbeit). Dieser "verschachtelte Link" weist direkt auf eine praktische Antwort hin. –

+0

Keine Notwendigkeit, eine Meinung zu fächeln, wenn Sie denken, dass eine Frage unpraktisch ist. Lassen Sie jemanden anderen für die Frage besser beantworten oder lassen Sie die Frage unbeantwortet und richtig sein. Zweitens habe ich diese Seite besucht und konnte keine Antwort sehen, aber etwas Marketing-Klappentext über ein Frontend, das weder ein Beispiel noch einen Download-Link hatte. Wenn es eine tatsächliche Antwort gibt, bearbeiten Sie die Antwort und fügen Sie sie hier hinzu, falls die Seite ausfällt. –

4

Ich habe festgestellt, vor kurzem einige Grammatikdateien für C++ (C++ 1998: ISO/IEC 14882: 1998 und C++ 2008: ISO/IEC SC22/WG21 N2723 = 08-0233) am grammarware website. Die Grammatiken sind in der Notation Enanced BNF, DMS BNF, BGF, SDF und Rascal dargestellt. Es ist schade, dass die C++ - Grammatiken nicht aktualisiert werden (kein C++ 2003 oder C++ 11).