Psycho~zicke Geschrieben 26. Oktober 2007 Geschrieben 26. Oktober 2007 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 Zitieren
Guybrush Threepwood Geschrieben 26. Oktober 2007 Geschrieben 26. Oktober 2007 Soll das so sein? äh das musst du doch wissen wenn du es selber geschrieben hast :confused: Zitieren
Psycho~zicke Geschrieben 26. Oktober 2007 Autor Geschrieben 26. Oktober 2007 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. Zitieren
Guybrush Threepwood Geschrieben 26. Oktober 2007 Geschrieben 26. Oktober 2007 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. Zitieren
Klotzkopp Geschrieben 26. Oktober 2007 Geschrieben 26. Oktober 2007 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 kontrollierenKlar, 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. Zitieren
Psycho~zicke Geschrieben 26. Oktober 2007 Autor Geschrieben 26. Oktober 2007 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? Zitieren
Psycho~zicke Geschrieben 26. Oktober 2007 Autor Geschrieben 26. Oktober 2007 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 Zitieren
Klotzkopp Geschrieben 26. Oktober 2007 Geschrieben 26. Oktober 2007 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. Zitieren
Psycho~zicke Geschrieben 26. Oktober 2007 Autor Geschrieben 26. Oktober 2007 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 Zitieren
Klotzkopp Geschrieben 26. Oktober 2007 Geschrieben 26. Oktober 2007 Mir sind noch zwei Dinge aufgefallen: - Du berücksichtigst Präprozessordirektiven nicht. Das ist aber auch nicht so leicht umzusetzen. - Du berücksichtigst Trigraphs (und seit C99 auch Digraphs) nicht. Zitieren
Guybrush Threepwood Geschrieben 26. Oktober 2007 Geschrieben 26. Oktober 2007 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 Zitieren
MWS Geschrieben 26. Oktober 2007 Geschrieben 26. Oktober 2007 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. Zitieren
flashpixx Geschrieben 28. Oktober 2007 Geschrieben 28. Oktober 2007 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 Zitieren
Guybrush Threepwood Geschrieben 29. Oktober 2007 Geschrieben 29. Oktober 2007 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 Na weil es sich dabei wohl um eine Übungsaufgabe handelt Zitieren
Empfohlene Beiträge
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.