Forum: Compiler & IDEs C Compiler Gerüst


von Stefan Sonnen (Gast)


Lesenswert?

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

von yalu (Gast)


Lesenswert?

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.

von Stefan Sonnen (Gast)


Lesenswert?

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

von yalu (Gast)


Lesenswert?

> 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.

von WEIF (Gast)


Lesenswert?

Hi,

schau dir mal den LCC an,

http://www.cs.princeton.edu/software/lcc/

der ist mit "wenig" Aufwand an verschiedene Cores anpaßbar und sollte 
auch für deine Anwendung geeignet sein.

ciao

WEIF

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.