[C++] Parser verbessern

kodak

Mitglied
Hi Leute,

mit c++ kenne ich mich noch nicht so gut aus. Da ich es aber für einen Server praktischer finde, will ich so einen auch in C++ schreiben. Das Grundprinzip funkioniert schon, jetzt will ich noch einen Parser schreiben, dass der Server die Befehle auch benutzen kann. Dazu sollen die gesendeten Zeichenketten in 3 Bestandteile zerlegt werden:
- Absender
- Befehl
- Parameter des Befehls
Das habe cih auch gemacht, aber mich würde interessieren, wie ich meinen bisherigen parser code verbessern kann, bzw welche Programmierwerkzeuge/Techniken dafür besser geeignet wären.

Hier mein Code
Code:
//Den Befehl parsen und Serverrelevante Befehle erfassen
int msgPos=1;
//Absender ermitteln
while(1)
  {
    if (msgPos>(int)strlen(buf2)) break;
    if (buf2[msgPos] == ':')
      {
   msgPos++;
   break;
      }
    else
      {
   sprintf(buf_name,"%s%c ",buf_name,buf2[msgPos]);
      }
    msgPos++;
  }
//Befehl erfassen
while(1)
  {
    if (msgPos>(int)strlen(buf2)) break;
    if (buf2[msgPos] == ':')
      {
   msgPos++;
   break;
      }
    else
      {
   sprintf(buf_command,"%s%c ",buf_name,buf2[msgPos]);
      }
    msgPos++;
  }
//Übergabewerte erfassen
while(1)
  {
    if (msgPos>(int)strlen(buf2)) break;
    if (buf2[msgPos] == ':')
      {
   msgPos++;
   break;
      }
    else
      {
   sprintf(buf_expression,"%s%c ",buf_name,buf2[msgPos]);
      }
    msgPos++;
  }

Vielen Dank schonmal für die Hilfe
 
Wenn dein Code so funktioniert wie du möchtest, ist doch okay.

Wenn du aber einen "professionelleren" Parser schreiben möchtest,
mussst du dich über die Automatentheroie informieren.
Es ist ein etwas komplexeres (mathematisches) Thema, aber sehr
hilfreich beim Parser (und Compilerbau :-) ).

Gruß, Chris
 
Du könntest Dich natürlich auch mit lex und yacc (oder bison) beschäftigen. Damit kann man nämlich Parser generieren.
 
Automaten? Lass mich bloß in Ruhe Theoretische Informatik 4 ist mehr eine Strafe als eine Vorlesung ;)

T(M)=({z0..z5,E}, {:,;,Name,Befehl,Param}, {(z0,Name,z1),(z1,:,z2),(z2,Befehl,z3),(z3,:,z4),(z4,Param,z5),(z5,;,E)}, {z0}, {E}) :D

Aber mal davon abgesehen, irgendein Fehler ist noch in meinem "unprofessionellen" Parser drinne. ich erhalte immer ein einziges Zeichen in den 3 ausgabestrings, die aber nicht in dem Eingabestring stehen. Genug Speicherplatz ist reserviert. Und das System muss funktionieren, da ich es aus einer anderen Sprache übernommen habe, es muss also ein Syntaxfehler sein. ich kann mir aber nicht vorstellen wo - höchstens ein Fehler in den sprintf anweisungen, aber "%s%c" müsste ja stimen, da ich den string(chararray) durch ein einzelnen char aus einem array erseitete. Gibts es noch einen einffachereren Befehl als sprintf? So im Stiel von char[]=char[]+char2[Position]?
 
Zurück