C Compiler Gerüst

Gast #983960
Moin!

Ich möchte ein vorhandenes (großes) C Programm automatisch nach 
bestimmten Funktionsaufrufen und vor return-statements mit 
Debug-Meldungen ergänzen. Wahrscheinlich kommen weitere Änderungen 
hinzu, die ich im Moment noch nicht abesehen kann.

Darum stelle ich mir vor, einen einfachen C Parser zu verwenden, der im 
wesentlichen den Input wieder ausgibt, und leicht um ein paar Änderungen 
ergänzt werden kann. Der Parser muß nicht den kompletten ANSI C Standard 
abdecken, da das Programm keine außergewöhnlichen Features verwendet. 
Wichtiger wäre, daß der Parser übersichtlich und leicht zu erweitern 
ist.

Gibt es einen solchen Parser, möglichst auf der Basis von bison/yacc mit 
einer für flex definierten Syntax?

Stefan
Gast #984198
Der GCC hatte bis Version 3.3.x einen Bison/Flex-Parser, den du
ausschneiden könntest.

Evtl. möchtest du noch einen Präprozessor davorschalten. Dazu kannst du
ebenfalls den vom GCC nehmen. Über die #<zeilennummer>-Direktiven in der
Ausgabedatei stellst du die Verbindung zu den Original-C-Dateien her, um
dort die automatischen Änderungen vornehmen zu können.

Eine ANSI-C-Grammatik in BNF gibt es hier:

  http://www.cs.man.ac.uk/~pjj/bnf/c_syntax.bnf

Es dürfte nicht so schwer sein, diese ins Bison-Format zu bringen.
Gast #984941
Danke, das sind sehr brauchbare Hinweise. Gibt es evtl. einen weniger 
ausgewachsenen Compiler als den gcc, der einfacher zu verstehen ist? 
Sonst werde ich mich daran machen, den gcc-Parser zu verwenden.

Du schreibst, bis Version 3.3.x hatte der gcc einen Bison/Flex Parser. 
Was wird denn seitdem verwendet, und warum?

(Ich habe mir mal verschiedene Releases angesehen, und in 3.4.6 und 
4.0.0 habe ich immer noch eine c-parse.y gefunden, die mir nach einem 
Parser für C aussieht)

Stefan
Gast #984952
> Du schreibst, bis Version 3.3.x hatte der gcc einen Bison/Flex Parser.
> Was wird denn seitdem verwendet, und warum?

Der neue Parser ist handgeschrieben und arbeitet nach dem Prinzip des
rekursiven Abstiegs.

  http://en.wikipedia.org/wiki/Recursive_descent_parser

> (Ich habe mir mal verschiedene Releases angesehen, und in 3.4.6 und
> 4.0.0 habe ich immer noch eine c-parse.y gefunden, die mir nach einem
> Parser für C aussieht)

Entschuldigung, da habe ich mich geirrt. In Version 3.4 kam der
handgeschriebene C++-Parser, der handgeschriebene C-Parser erst in
Version 4.1.

Gründe für die Umstellung:

Aus http://gcc.gnu.org/gcc-3.4/changes.html:

  A hand-written recursive-descent C++ parser has replaced the
  YACC-derived C++ parser from previous GCC releases. The new parser
  contains much improved infrastructure needed for better parsing of C++
  source codes, handling of extensions, and clean separation (where
  possible) between proper semantics analysis and parsing. The new
  parser fixes many bugs that were found in the old parser.

Aus http://gcc.gnu.org/gcc-4.1/changes.html:

  The old Bison-based C and Objective-C parser has been replaced by a
  new, faster hand-written recursive-descent parser.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.