linken_harmy Geschrieben 18. März 2005 Geschrieben 18. März 2005 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 Zitieren
kLeiner_HobBes Geschrieben 18. März 2005 Geschrieben 18. März 2005 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? Zitieren
linken_harmy Geschrieben 19. März 2005 Autor Geschrieben 19. März 2005 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... Zitieren
Bubble Geschrieben 19. März 2005 Geschrieben 19. März 2005 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. Zitieren
linken_harmy Geschrieben 20. März 2005 Autor Geschrieben 20. März 2005 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! Zitieren
kLeiner_HobBes Geschrieben 21. März 2005 Geschrieben 21. März 2005 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. Zitieren
linken_harmy Geschrieben 21. März 2005 Autor Geschrieben 21. März 2005 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 !!!! Zitieren
Glen Coe Geschrieben 22. März 2005 Geschrieben 22. März 2005 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. Zitieren
Bubble Geschrieben 22. März 2005 Geschrieben 22. März 2005 Hast recht, die Funktionen gibt's tatsächlich. 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.