[WikiDyd] [TitleIndex] [WordIndex

Laboratorium ,,Języki i metodyka programowania I''

Projekt indywidualny: Drzewo wywołań funkcji w programach w C

Proszę zaprojektować i wykonać program wypisujący drzewo wywołań funkcji na podstawie analizy programu w języku C.

Program ma być wywoływany z listą argumentów - nazw plików zawierających kod w jęz. C. Program ma czytać te pliki i na ich podstawie budować strukturę danych określającą z jakich funkcji składa się analizowany kod i jak te funkcje są powiązane wywołaniami. Na zakończenie program powinien wypisywać drzewo wywołań funkcji.

Na przykład wyobraźmy sobie plik źródłowy o postaci:

   1 int fa( int x ) {
   2   return 2*x;
   3 }
   4 
   5 int fb( int x ) {
   6   x= fc(x);
   7   return 2*fa(x);
   8 }
   9 
  10 int main( ) {
  11   int i= 5;
  12   printf( "funkcjaa(%i)=%i", i, fa(i) );
  13   printf( "funkcjab(%i)=%i", i, fb(i) );
  14   printf( "funkcjac(%i)=%i", i, fc(i) );
  15   return 0;
  16 }

Po przeczytaniu takiego pliku "nasz" program powinien wypisywać coś w rodzaju:

Plik p.c:

   Funkcja fa:

   Funkcja fb:
      Wywołuje:
         fc
         fa

   Funkcja main:
      Wywołuje:
         printf (3 razy)
         fa
         fb
         fc
  1. Program powinien umożliwiać:
    • . przetwarzanie dowolnie wielu plików w jednym przebiegu
    • . ignorowanie pewnych funkcji (zgodnie z lista domyślną, lub listą dostarczoną przez użytkownika)
    • . wypisywanie numerów linii, gdzie rozpoczyna i kończy się funkcja oraz gdzie są wywoływane poszczególne funkcje
  2. Program powinien poprawnie reagować na niezbilansowanie nawiasów klamrowych w plikach źródłowych.
  3. Program powinien poprawnie obsługiwać komentarze

  4. Program ma być zbudowany modularnie. Podział na pliki źródłowe ma być odzwierciedleniem funkcjonalnej struktury programu.
    • Lista modułów:
    • . analizator leksykalny
    • . kontener danych
    • . lista funkcji pomijanych
    • . formater wydruku
    • . sterowanie
  5. Opcje:
    • . ignorowania makrodefinicji: Jeżeli w pliku źródłowym występuje np. makrodefinicja

   #define max(A,B) ((A)>(B)?(A):(B))

   int fx( double a ) {
      ....
      cos_tam= max( cos, cos_innego );
      ...
   }

2015-09-23 06:43