Bitte meinen Code anschauen



  • Hallo, würdet ihr so nett sein und auch mal diesen Code anschauen.

    Es ist ein einfacher Parser. Damit soll es möglich sein Parameter und den Funktionsnamen auszulesen.

    Beispiel:

    // Beispielfunktion
    string zeile = "InitGraphic(640,480,32)";
    
    // Funktionsnamen extrahieren
    string fuktionsname = GetFunctionName(string zeile);
    
    // Ersten Parameter
    string param1 = GetParameter(zeile,1);
    
    // Zweiten Parameter
    string param2 = GetParameter(zeile,2);
    
    // usw....
    
    string
    GetFunctionName(string line)
    {
    	size_t i1 = line.find("(");
    	string s1 = line.substr( 0, i1-1); // n Zeichen ab dem i-ten Zeichen von s
    
        while( !s1.empty() && isspace( *s1.begin() ) )
            s1.erase( s1.begin() );
        while( !s1.empty() && isspace( *(s1.end()-1) ) )
            s1.erase( s1.end()-1 );
    
    	return s1;
    }
    
    string
    GetParameter(string line,int index)
    {
    	int acIndex=0;
    	size_t breite=0;
    	unsigned int i;
    
    	string test;
    
    	string s1 = line.substr(line.find("(")+1,line.find(")")-line.find("(")-1);
    
        while( !s1.empty() && isspace( *s1.begin() ) )
            s1.erase( s1.begin() );
        while( !s1.empty() && isspace( *(s1.end()-1) ) )
            s1.erase( s1.end()-1 );
    
    	for(i=0; i<s1.length(); i++)
    	{
    		if(s1.substr(i,1)==",")
    			acIndex++;
    
    		if(acIndex==index-1)
    			break;
    	}
    
    	if(i==0)
    	{
    		breite = s1.find(",",i);
    	}
    	else
    	{
    		breite = s1.find(",",i+1)-i-1;
    		i = i + 1;
    	}
    
    	return s1.substr(i,breite);
    }
    

    Der Code funktioniert zwar, aber was haltet ihr davon? Gibt es Fehlerquellen die ich übersehen haben könnte. Was könnte ich besser machen. Würdet ihr es anders machen. Danke für eure Mühe und Meinungen. 🙂



    • Benutz eine Funktion, um den doppelten Code loszuwerden (isspace/erase).
    • Deine Funktionen fallen bei einer ungültigen Eingabe auf die Nase, z.B. wenn gar keine Klammer drin ist.
    • Warum suchst du die Kommas nicht auch mit find, sondern mit diesem seltsamen Ein-Zeichen-substr-Konstrukt?
    • Bei verschachtelten Funktionsaufrufen, geklammerten Ausdrücken oder Casts an den Parametern funktioniert der Code nicht.
    • Bei einem expliziten Aufruf von operator() funktioniert der Code nicht.
    • i = i + 1? Kommst du von BASIC?


  • Ja würde ich es anders machen. Und zwar würde ich mit mal Boost.Spirit ansehen, oder zumindest versuchen irgendwie in Richtung Recursive-Descent-Parser zu gehen.


Anmelden zum Antworten