Text scannen
-
Hallo!
Ich versuche zurzeit einen kleinen Interpreter fuer eine selbst definierte Programmiersprache zu bauen. Eigentlich hab ich schon ein gutes konzept, nur habe ich jetzt ein Problem:
Jedes Wort in dem zu scannenden Textes wird in einen eigenen String in einem String array gespeichert. Wenn man ein Leerzeichen schreibt, wird dieses nicht mitgenommen. Das klappt auch ganz gut, aber wenn man jetzt ein Sonderzeichen wie z.B.: ( , = oder ) nimmt, dann werden die Leerzeichen davor und dahinter auch in einen String gespeichert.
Hier der wichtigste Teil des Codes:
bool C_SCANNER::scan_text(string text, C_EXPRESSION **expr) { string temp; TOKEN tok = NORMAL; char act_tok; bool last_semikolon = false; // speichert ob letztes zeichen ein // Semikolon war int tok_count = 0, expr_count = 0; int act_line = 0; // j speichert die aktuelle stelle im Wort while(tok_count < text.length()) { act_tok = text[tok_count]; tok = get_token(act_tok); if(tok == NORMAL || tok == DIGIT) { temp += act_tok; last_semikolon = false; } else if(tok == ANFUEHRUNG) { // Hier kommt noch Code last_semikolon = false; } else { if(tok == NEWLINE) { if(!last_semikolon) { cout << "Scanner Fehler: Fehlendes Semikolon! In Zeile:" << act_line + 1 << endl; return false; } last_semikolon = false; act_line++; tok_count++; continue; } expr[expr_count]->addWord(temp); if(tok != WHITESPACE) { temp = act_tok; expr[expr_count]->addWord(temp); } temp = ""; last_semikolon = false; if(tok == SEMIKOLON) { expr_count++; last_semikolon = true; } } tok_count++; } return true; }und dann noch:
C_SCANNER::TOKEN C_SCANNER::get_token(char a) { TOKEN curr_tok = NORMAL; if(a >= '0' && a <= '9') curr_tok = DIGIT; if(a == '+') curr_tok = PLUS; if(a == '-') curr_tok = MINUS; if(a == '*') curr_tok = MUL; if(a == '/') curr_tok = DIV; if(a == '=') curr_tok = ASSIGN; if(a == '(') curr_tok = LBRAKET; if(a == ')') curr_tok = RBRAKET; if(a == ';') curr_tok = SEMIKOLON; if(a == ' ') curr_tok = WHITESPACE; if(a == '\n')curr_tok = NEWLINE; if(a == '"') curr_tok = ANFUEHRUNG; return curr_tok; }aus Platzgruenden habe ich nicht das ganze Projekt rein geschrieben. Wer es haben will kann mir seine E-Mail hier reinschreiben, ich schick es euch gerne

mfg LastManStanding
-
Hallo,
Das Problem besteht darin, dass deine Funktion immer dann, wenn das Zeichen ein Sonderzeichen ist, die Funktion addWord(temp)
expr[expr_count]->addWord(temp); <-- diese hier if(tok != WHITESPACE) { temp = act_tok; expr[expr_count]->addWord(temp); }aufruft. Ich nehme an, dass es nicht Leerzeichen sind, die vor und nach einem Sonderzeichen gespeichert werden, sondern leere Strings. Hoffe ich konnte dir Helfen!
Grüße
-
Ahh!
Danke! EIn kleiner Denkfehler von mir. Ich dachte es waere egal da in temp nichts drinnen steht. Allerdings wird ja im Array weitergegangen.OK! Vielen Dank!
mfg LastManStanding