Zum Inhalt springen

Programm auf elementare Syntaxfehler überprüft


Psycho~zicke

Empfohlene Beiträge

Guten Morgen!

Ich hab die aufgabe ein Programm zu schreiben das elementare Syntaxfehler überprüft wie z.B. falsch verschachtelte runde Klammern. Nun habe ich dieses Programm geschrieben. Wenn ich es compiliere bekomm und eine Eingabe mache bekomm ich nur meine Eingabe wieder raus. Soll das so sein?

Da ich das mit dem debuggen leider immernoch nicht wirklich raus hab, wollt ich euch fragen ob das Programm richtig Funktioniert. Evt kann mir ja auch jemand Tips zu geben wie mans einfacher schreiben kann oder leicht verständlicher oder so. Die Kommentaren fehlen zum größten Teil noch da ich mir wie gesagt nicht sicher bin ob das Programm das macht was es soll.


Schreiben Sie ein Programm, das ein C-Programm auf elementare Syntaxfehler überprüft, 

wie zum Beispiel falsch verschachtelte runde Klammer, geschweifte Klammern und eckige 

Klammern. Vergessen Sie dabei nicht, Anführungszeichen, Doppelanführungszeichen und 

Kommentare korrekt zu bahndeln. (Es ist nicht leicht, ein völlig allgemeinnütziges 

Programm für diesen Zweck zu fomulieren.)

* ********************************************************/


#include <stdio.h>


// deklaration der Variablen

int Geschweifte,

    Eckige,

    Normale;


void in_quote(int c);   // deklaration der Funktin in_quote

void in_comment(void);  // deklaration der Funktion in_comment

void search(int c);   // deklaration der Funktion search


void main()

{

     // deklaration der Variablen

     int iEingabe;


     // Wird solange ausgeführt wie iEingabe kein A ist              

     while ((iEingabe = getchar()) != 'A')

     {

        if (iEingabe == '/')    // Prüft ob iEingabe ein / ist

        {

           if ((iEingabe = getchar()) == '*')  

           {

              in_comment();

           }

           else

           {

              search(iEingabe);

           }

         } 

         else if (iEingabe == '\'' || iEingabe == '"')

         {

              in_quote(iEingabe);

         }

         else

         {

              search(iEingabe);

         }

         if (Geschweifte < 0)

         {

              printf("Unausgeglichene Geschweifteklammern\n");

              Geschweifte = 0;

         }

         else if (Eckige < 0)

         {

              printf("Unausgeglichene Eckigeklammern\n");

              Eckige = 0;

         }

         else if (Normale < 0)

         {

              printf("Unausgeglichene Normaleklammern\n");

              Normale = 0;

         }

     }

     if (Geschweifte > 0)

     {

        printf("Unausgeglichene Geschweifteklammern\n");

     }

     if (Eckige > 0)

     {

        printf("Unausgeglichene Eckigeklammern\n");

     }

     if (Normale > 0)

     {

        printf("Unausgeglichene Normaleklammern\n");

     }

}

// definition der Funktion search

void search(int c)

{

  extern int Geschweifte,

             Eckige,

             Normale;


    if (c == '{')

    {

       ++Geschweifte;

    }

    else if (c == '}')

    {

       --Geschweifte;

    }

    if (c == '[')

    {

       ++Eckige;

    }

    else if (c == ']')

    {

       --Eckige;

    }

    if (c == '(')

    {

       ++Normale;

    }

    else if (c == ')')

    {

       --Normale;

    }

}        

// definition der Funktion in_comment

void in_comment(void)

{

    int     c,

            d;


    c = getchar();

    d = getchar();

    while (c != '*' || d != '/')

    {

        c = d;

        d = getchar();

    }

}

// definition der Funktion in_quote

void in_quote(int c)

{

    int     d;

    while ((d = getchar()) != c)

    {

       if (d == '\\')

       {

          getchar();

       }

    }

}

Danke schon ma im Vorraus.

Liebe Grüße

die Zicke

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem ist eher das ich nicht genau weiß was das Programm laut aufgabe machen soll bzw was es ausgeben soll und wie. Darum fragte ich ja ob das so sein soll... Das das Programm so wie es da steht die einzlenen Zeilen wieder zurück gibt weißt ich ja.

Meine Frage war eher ob das Programm so richtig ist(die Anforderungen der Aufgabe entspricht), obs eine möglichkeit gibt ausser mit diesem Debugger das Programm auf Richtigkeit zu kontrollieren und obs evt einfachere Methoden gibt das Programm zu schreiben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem ist eher das ich nicht genau weiß was das Programm laut aufgabe machen soll bzw was es ausgeben soll und wie. Darum fragte ich ja ob das so sein soll...
Dafür, dass du also die Aufgabe nicht genau verstanden hast, ist das Programm aber ziemlich gut. Du bist entweder ein Naturtalent oder du hast es vielleicht doch nicht ganz allein geschrieben ;)

Meine Frage war eher ob das Programm so richtig ist(die Anforderungen der Aufgabe entspricht),
Du berücksichtigst //-Kommentare nicht. Gut, die sind erst seit C99 erlaubt, aber immerhin verwendest du sie selbst.

obs eine möglichkeit gibt ausser mit diesem Debugger das Programm auf Richtigkeit zu kontrollieren
Klar, mit entsprechenden Tests.

und obs evt einfachere Methoden gibt das Programm zu schreiben.
Kaum.

Naja also ich würde bei der Aufgabenstellung die einem Compiler ja schon sehr nahe kommt erwarten auch die selbe Ausgabe wie bei einem Compiler zu bekommen.

Also zum Beispiel "Fehlende ) in Zeile 25" usw.

Abgesehen davon, dass der Compiler kaum feststellen kann, wo eine Klammer fehlt (sondern nur, dass), war das laut dem einleitenden Kommentar auch nicht gefordert.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmm... Wenn eine Klammer fehlt unterbricht der compiler doch direkt mit einer Fehlermeldung. Also kann ich in dem Fall nicht anhand des compilierten Programms schauen ob alles richtig is oder hab ich das jetzt falsch verstanden/aufgefasst?

Hab es auch nicht allein geschrieben hab mir bissel bei helfen lassen. Wenn ich ein Naturtalent wäre hätte ich nicht soviele Probleme mit diesen Programmen ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab es auch nicht allein geschrieben hab mir bissel bei helfen lassen. Wenn ich ein Naturtalent wäre hätte ich nicht soviele Probleme mit diesen Programmen ;)

Aber du siehst jetzt hoffentlich, was du davon hast. Du hast zwar ein Programm, aber du weißt nicht, wie es funktioniert, du kannst nicht mal beurteilen, ob es funktioniert.

Wer immer dir dabei geholfen hat, hat dir keinen Gefallen getan.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da hast du recht. Schreib die Programme ja eigentlich auch immer alleine auch wenn dann oft mist bei rauskommt aber diesma gab mein chef mir 2 Tage zeit und da ich diesmal absolut nicht weiterkam bat ich nen freund um hilfe... War ne doofe idee...

Naja am besten fang ich noch ma von anfang an mit dem Programm und hoff das ich meinem chef kla machen kann das ich es nicht fertig bekommen hab.

Trotzdem danke an euch

Link zu diesem Kommentar
Auf anderen Seiten teilen

Abgesehen davon, dass der Compiler kaum feststellen kann, wo eine Klammer fehlt (sondern nur, dass), war das laut dem einleitenden Kommentar auch nicht gefordert.

Doch in den meisten Fällen kann er das schon und das sogar genau an welcher Stelle und nicht nur in welcher Zeile und im schlimmsten Fall bekommt man halt die Zeile wo die Anweisung endet,wenn sie sich über mehrere Zeilen erstreckt, was ja auch nicht schlimm ist :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi, nur mal als gedanklichen Anstoß.

Das obige Programm testet lediglich auf paarweises vorkommen von einigen Zeichen (die auch noch hartcodiert sind).

Ich muss gestehen, ich selbst gebe in der Regel meinen Code nicht an der Console ein ;) aber vielleicht machen das die Profis so ?

Hm ... nee ernsthaft, war die Aufgabenstellung nicht: "ein C-Programm auf elementare Syntaxfehler überprüfen".

Bei Syntax fällt mir persönlich sofort "Wortschatz" und "Grammatik" ein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Bei Syntax fällt mir persönlich sofort "Wortschatz" und "Grammatik" ein.

da muss ich Dir Recht geben, vor allem sind hier die Schlagworte kontextfreie / kontextsensitive Grammatiken.

Zum OP, wenn Du Deinen eigenen Parser schreiben willst, dann wird das nicht mehr naiv lösbar sein, denn Du müsstest ja den vollständigen C Syntax modellieren. Wenn Du nur bestimmte Aspekte prüfen willst, dann könnte ich Dir zu einer logischen Sprache raten z.B. Prolog mit den Definite Clause Grammars.

Generell zu Deiner Prüfung von Klammern würde ich einen PDA / Kellerautomaten einsetzen.

Wenn Du Den Syntax des Codes einfach prüfen willst, warum versuchst Du ihn dann nicht zu kompilieren und die Fehlermeldungen weiter zu verarbeiten, dann brauchst Du nicht selbst den Parser zu entwickeln

HTH Phil

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...