Integer STate Machine



  • Hallo,

    ich soll nen Compiler schreiben. Erster Schritt ist ein Lexer.
    Um zu prüfen ob ein Integer vorliegt , wurde mir gesagt soll ich einen endlichen Automaten implementieren. +100, 0 , 50 wären alles Integer. So würde meine Implementierung aussehen.

    bool state1,state2,state3 = false;
    //Integer
    bool stateInteger(char s)
    {
    	if(!state1 &&  (s =='+' || s == '-' || s=='0' || s =='1' || s =='2'|| s =='3' || s == '4' || s =='5' || s =='6' || s =='7'|| s =='8' ||  s == '9') )
    	{
    		state1 = true;
    	}
    	else if(state1 && (s =='1' || s =='2'|| s =='3' || s == '4' || s =='5' || s =='6' || s =='7'|| s =='8' ||  s == '9'))
    	{
    		state2 = true;
    	}
    	else if(state1 && state2 )
    	{
    		state1,state2 = false;
    		return  true;
    	}
    	else
    	{
    		return false;
    	}
    
    }
    


  • Nee, das schaut nicht gut aus.



  • Schreib mal ein Testprogramm, in dem du diese Implementierung verwendest.
    Und normalerweise nimmt man nicht mehrere bools um den State einer State-Machine zu speichern, sondern einen Integer (oder enum-Typen).

    Dann fehlt an zwei Stellen ein return .
    Und zu guter letzt macht deine Funktion nicht das was sie machen soll. Die State-Changes sind totaler Unsinn. Du brauchst ja nur mal ein paar Beispiele im Kopf durchzugehen.

    ps:
    Und state1,state2 = false; ist überhaupt totaler Blödsinn. Macht auch nicht das was du vermutlich glaubst was es machen soll.



  • Und state1,state2 = false; ist überhaupt totaler Blödsinn.

    Ja klar 🙂 state1 bleibt im alten Zustand. Hmm. Wieso geht das dann überhaupt.

    Und ja meine Implementierung ist sicher nicht optimal. Deswegen poste ich sie ja hier 🙂 Das ist schwerer als gedacht. Im Internet find ich auch nix dazu.



  • MasterStudent schrieb:

    Ja klar 🙂 state1 bleibt im alten Zustand. Hmm. Wieso geht das dann überhaupt.

    In C++ gehen viele Dinge die keinen Sinn machen.
    Der Komma-Operator macht sehr selten Sinn. Gibt aber Fälle. z.B. kann man den in Makros manchmal gut brauchen.

    MasterStudent schrieb:

    Und ja meine Implementierung ist sicher nicht optimal. Deswegen poste ich sie ja hier 🙂 Das ist schwerer als gedacht. Im Internet find ich auch nix dazu.

    Ach geh, mit https://google.com/search?q=state+machine+example findet man schon einiges.



  • @MasterStudent: lies dir auch mal die beiden Artikel Interpreterbau - Ein Anfang (Scanner entspricht dem Lexer) und Compilerbau durch (oder überfliege sie wenigstens ;-).



  • Ich hab da eine Verständnisfrage, die ich für meine Zukunft mit dem Programmieren für wichtig halte, und die mit diesem Thema zu tun hat:
    Wieso mach ich nicht einfach das hier, wenn ich einen Integer haben will?

    int i;
    if istream >> i
      // integer
    


  • Also mein Lexer soll folgenden Ausdruck auswerten.

    (527+3.4)*7

    Den Integer und Double muss ich versuchen in einen Zustand zu packen.

    Ein Lexer würde doch auch sowas auswerten.

    (523var) * 7

    Der würde doch dann die Token (,523,var,),*,7 zurückliefern.

    Das da ein Plus fehlt das merkt doch erst der Parser oder ?



  • Gibt es im Web nee Implementierung für eine Integer State machine ?



  • MasterStudent schrieb:

    Gibt es im Web nee Implementierung für eine Integer State machine ?

    Kläre uns doch mal auf, was Dein Ziel ist. Du hast geschrieben, dass Du einen Compiler schreiben "sollst". Und jetzt fragst Du, ob es ne Implementierung im Web gibt. Also was ist das Ziel?

    Willst Du lernen, wie man einen Compiler baut? Dann ist eine Implementierung aus dem Web keine Lösung.

    Willst Du einfach den Schein bekommen? Dann halte ich es für besser, Du würdest den Schein nur dann bekommen, wenn Du die State-Machine nachweislich selbst geschrieben hast.

    Oder willst Du nur eine Aufgabe lösen? Dann nimm doch einen fertigen Compiler. Die gibt es wie Sand am Meer.

    Und da es fertige Compiler wie Sand am Meer gibt und Compiler in der Regel mit Integern umgehen können, dann wird es auch fertige Implementierungen für so eine State Machine geben.

    Und hast Du Dich mal mit einer Anleitung zum Compilerbau wie beispielsweise den bereits erwähnten beschäftigt? Wenn nein, dann tue es und stelle dann Fragen. Wenn ja, dann frage konkret, was Du nicht verstanden hast.

    Ich glaube kaum, dass hier jemand so auf die schnelle besser erklären kann, wie man Integer parst als jemand, der so ein Tutorial im Web veröffentlicht hat.



  • Finde es jetzt schade, dass ich nicht ernst genommen werde, oder als Troll abgestempelt. Wenns nämlich darum geht nen Integer zu parsen, dann bietet doch die stdlib alles was man braucht, so wie ich im vorherigen Post geschrieben habe. Der >> Operator für Integer macht das doch alles für mich. Oder gehts darum das Rad neu zu erfinden?


Anmelden zum Antworten