Veröffentlicht 18. März 200520 j Hallo, ich hab ne Aufgabe bei der ich einen lexikalischen Analysator in C++ coden soll, der mit einigen wenigen Regeln auskommt. Die zulässigen Zeichen sind die Terminalklassen b (Buchstaben) z (Zahlen) und das underscore-Zeichen. Ich hab den Analysator bereits implementiert und er läuft unter der Verwendung der chars 'b' 'z' und '_'. Jetzt will ich ihn so umstellen, dass er effektiv ASCII Zeichen erkennt. Mein Code ist ziemlich spaghettimäßig (wegen der Brute-Force Implementierung der Sprachenregeln) aber ich habe bisher nur die Idee gehabt, eben anstatt nach 'b' nach den Werten der ASCII Tabelle abzufragen, die eben der Terminalklasse Buchstaben entsprichen. Gibt es nicht so ein Konstrukt in C++, wo ich quasi alle Buchstaben als char einsetzen kann und dann über ein Symbol darauf zugreifen kann? Ich hoff irgendjemand hat das überhaupt verstanden was ich will und kann mir da helfen thx
18. März 200520 j Ehrlich gesagt, ich habs nicht 100% verstanden. Weil ein l.A. soll doch auch gewisse Grundelemente erkennen können, und das hab ich bei dir nicht rauslesen können. Hast du das ganze objektorientiert gemacht? Oder rein strukturiert?
19. März 200520 j Hmm, ok das versteh ich, ich werds versuchen mit pseudo "kot" auszudrücken group zahlen { ASCII werte aller Ziffern; } group buchstaben { ASCII-Werte aller Buchstaben; quasi 'a' 'b' 'c' ... usw } während der lexikalischen prüfung soll dann quasi sowas möglich sein: if (aktuell eingelesenes Zeichen == Element of zahlen) then.... Dieses group sollte eben das Konstrukt sein mit dem ich eine Abfrage wie if (aktuelles Zeichen == ASCII-a bis ASCII-z) in jeder Abfrage ersetzen kann... Ok, jetzt wirds glaub nicht mehr verständlicher, deswegen hoff ich dass es irgendwer bis hierher versteht. Ich suche so etwas wie eine Variable, die eben alle Elemente der Terminalklasse Buchstaben enthält, aber da werd ich halt ne funktion brauchen, die sowas per ASCII-Werte direkt-Abfrage testet denke ich... :confused: Achja und objektorientiertheit kann ich noch nicht, haben erst vor einigen wochen den umstieg von c auf c++ gemacht...
19. März 200520 j Mir ist keine Funktion der C Standartbibliothek bekannt, die prüft, ob es sich bei einem ASCII Zeichen um eine Ziffer oder einen Buchstaben handelt. Allerdings ist das auch nicht besonders schwer selbst zu implementieren, denn alle Ziffern und Buchstaben liegen in der ASCII Tabelle, mehr oder weniger, benachbart, so dass Du nur auf Zahlenbereiche prüfen musst. Besorg Dir am besten eine ASCII Tabelle und schau sie Dir an, dann bekommst Du das sicher recht schnell selbst hin.
20. März 200520 j ja, sowas hab ich mir schon hergecodet, hab nur gedacht, vielleicht gibts da irgendwas cooles wie man das besser oder einfach gewitzter machen kann, aber dann lass ichs einfach so mit den ascii-Werten. Vielen Dank für eure Mühe!
21. März 200520 j Im Prinzip kannst du schon ein Konstrukt bauen nach dem Motto: class Terminalklasse { /*...*/ virtual bool IsValid(const char zeichen) = 0; }; class Buchstabe : public Terminalklasse { bool IsValid(const char zeichen) { if (zeichen > 64 && zeichen ....... ) return true; else return false; } } Da könntest du dir dann auch noch ne Fabrikklasse schreiben, die dir anhand eines char-Parameters ne Referenz auf die entsprechende Ableitung von "Terminalklasse" liefert.
21. März 200520 j Jo Mann, genau sowas meinte ich eigentlich!!! Dann muss ich mir jetzt nur noch das mit den klassen anschauen, weil so weit sind wir noch nicht im studium, aber das werd ich schon irgendwie herbringen! Danke nochmal !!!!
22. März 200520 j Mir ist keine Funktion der C Standartbibliothek bekannt, die prüft, ob es sich bei einem ASCII Zeichen um eine Ziffer oder einen Buchstaben handelt. Was sind dann die Funktionen isalpha(), isdigit(), islower() und ähnliche aus der C-Standardbibo (und deklariert in ctype.h)? Gruss, Glen.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.