Syntaxkontrolle

Razorhawk

Webdesigner und MSP
Ich habe hier mal ne Aufgabe uas dem Internet um C lernen zu können:

Code:
Schreiben Sie ein Programm, das als Eingabe den Namen einer C-Quelldatei von der Konsole
einliest und diese dann öffnet und syntaktisch analysiert.
Die Analyse soll folgende Überprüfungen enthalten:
- Korrekte Verwendung „runder Klammern“,
- Korrekte Verwendung „geschweifter Klammern“.
Im Falle eines Fehlers soll:
- die Zeilennummer, in welcher der Fehler aufgetreten ist,
- die Art der Klammer, bei der ein Fehler aufgetreten ist.
auf die Konsole ausgegeben werden.
Am Ende der erfolgreichen Überprüfung soll:
- das Ergebnis der Analyse,
- die Anzahl der Zeilen im Quelltext,
- die jeweils tiefste Schachtelungsebene für beide Klammerarten.
auf die Konsole ausgegeben werden.
Fehler sind:
- unbalancierte Klammerungen,
- offene Klammerebenen am Dateiende.
Zum Testen sollten Sie selbst kleine Testdateien erzeugen, die garantiert korrekt sind bzw. die
denkbaren Fehlertypen möglichst vollständig abdecken.

Ich hab noch nicht so recht eine Ahnung wie das funktionieren soll ohne dass ich das überäßig übertreibe.
Da die Aufgabe auch für C Einsteiger sein soll.
 
Moin Moin,

Übertreiben muss man das nicht.
Wie sehr Einsteiger bist du? Gehe hier mal davon aus, das die grundlegenden Befehle dir bekannt sind...

Vielleicht hilft dir folgende Zielsetzung für den Anfang:
1) erstmal Datei überhaupt öffnen und jedes Zeichen einlesen -> Anzahl Zeichen ausgeben
2) Überprüfen ob eingelesenes Zeichen überhaupt ne Klammer ist und alle vier möglichen Klammern ("(",")","{","}") zählen;
3) Aufgabe lösen,
Dazu brauch man - so als erste Idee - Merker für runde Klammern, Merker für geschweifte Klammern;
Dann einfach alle Klammern zählen bis ";" erreicht wird. bei öffnender Klammer Merker +1 bei schliesender Klammer Merker -1, Wenn am Ende Merker == 0 ist alles Ok sonst ist was falsch.
Die Anzahl Zeilen merkt man sich indem man die "\n" zählt.

Hoffe das hilft dir.
Gruss Michael
 
Also ich bin "Einsteiger" in Informatik im 3. Semester... soll heißen Grundprinzipien der Programmiersprache sind zu sind bekannt und zu einem Großen Teil verinnerlicht (weil ich schon vor dem Studium programmiert hab)
Wir hatten jetzt eine einwöchige Einführung zu C und dass gehört zum Aufgabenteil des 2. Tages.
Von daher dürfte es nicht so umfangreich sein :)
 
Moin,

Ich weiss jetzt nicht was du unter "Umfangreich" verstehst aber das müsste irgendwo zwischen ner halben und einer Seite Quellcode enden... Und das sollte noch nicht zuviel Arbeit sein...Mehr als Grundlagen brauch man nicht, soweit man einen kleinen Überblick über die Funktionen hat :-)

Gruss Michael
 
Noch ein kleiner Hinweis:
Der Zähler für die runden Klammern muß 0 sein, wenn ein ';' kommt, der Zähler für die geschweiften Klammern muß 0 sein, wenn die nächste Funktion beginnt bzw. die Date zu Ende ist.
 
Nachtrag zum Hinweis :)

Du wirst auch prüfen müssen, ob Klammern innerhalb eines Text-Blocks stehen. Die dürfen dann natürlich nicht mitgezählt werden. Das gilt dann auch für die Semikolonprüfung von Jokey2.
 
okay, das hab ich soweit im Prinzip alles fertig gemacht.
Also danke erstmal.
Mir hat schon der erste Post im Prinzip gereicht, aber dennoch habe ich eine Frage.

Wie kündigt sich denn immer eine Neue Funktion eindeutig an?
Ich meine die Funktionsnamen sind ja Frei wählbar bzw. haben ja nicht nur Funktionen neue Klammern sondern auf if then abfragen oder switches.
Als erstes würde mir einfallen, dass ich all die Schlüsselwörter bei der Suche mit einbeziehe, aber das wäre unsinnig, denn ich werde bestimmt nicht alle Schlüsselbefehle darin aufführen.

Weil da Problem ist ja, dass ich immer die Zeile ausgeben soll in der der Fehler vorkommt
 
Moin,
reicht es nicht zu wissen ob innerhalb einer Zeile, außerhalb von "Texten" alles stimmt?
ob ich schreib
Code:
if(1;
oder
Code:
meineFunktionmitunbekanntemNamen(;
sollte doch egal sein... Beides erfüllt den Tatbestand einer nicht gefundenen schließenden Klammer...
Es soll doch nur ermittelt werden, in welcher Zeile was nicht stimmt....
Gruss Michael
 
Vielleicht habe ich vergessen zu erwähnen, dass ich das für die geschweifte Klammer meine, denn da gibt es kein Abschlusszeichen wie ein Semikolon am Ende einer zeile.
Deswegen hatte ich gefragt wegen den variierenden Funktionsnamen (Funktionen die du selbst schreibst)

Da bin ich mir noch nicht ganz sicher wie ich das realisiere im Zusamenhang mit der zeilenangabe.

Ich habe es im Moment so implementiert, dass er mir am Ende des Programmdurchlaufs sagt ob irgendwo geschweifte Klammern noch offen sind, aber nicht ob zwischen 2 selbstgeschriebenen Funktionen auch noch klammern offen sind.
(des wegen auch if else und switch-Anweisungen)
 
Das wäre jetzt auch das was ich gemacht hätte so nach der Art "unerwartetes Dateiende gefunden...". Glaube nen Compiler macht das auch nicht immer anderes... man könnte evt . Header Dateien nach Funktionsköpfen durchsuchen, die sich merken und schauen, ob in der gerade gelesenen Zeile der Kopf zu finden ist... and so on... Das wird dann aber mehr als nötig...und artet in Fleissarbeit aus...

Gruss Michael
 
Zurück