Grundlagen verstanden - was jetzt?



  • cooky451 schrieb:

    LordJaxom schrieb:

    Glückwunsch, einen Scanner hast Du schon. Jetzt brauchst Du noch einen Parser, der die "Wörter" bzw. Terme auch zusammenrechnet.

    👍 Ging recht flott für einen Anfänger.

    Ja, sofern er nicht einfach nur Space als Token-Trenner genommen hat, was ich vermute.



  • cooky451 schrieb:

    👍 Ging recht flott für einen Anfänger. Bin gespannt ob er auch den Parser mit Punkt-Vor-Strich-Rechnung packt!

    Meinen ersten funktionstüchtigen Mathe-Parser hab ich vor geschätzt einem halben Jahr geschrieben. Ich tippe darauf, dass er das nicht schafft.



  • 314159265358979 schrieb:

    cooky451 schrieb:

    👍 Ging recht flott für einen Anfänger. Bin gespannt ob er auch den Parser mit Punkt-Vor-Strich-Rechnung packt!

    Meinen ersten funktionstüchtigen Mathe-Parser hab ich vor geschätzt einem halben Jahr geschrieben.

    Spirit? 🤡



  • Nene, schon ohne.



  • 314159265358979 schrieb:

    Nene, schon ohne.

    Schade. Ich bin nähmlich gerade auch dabei, nur muss ich jetzt noch "Aktionen" lernen. Soweit bin ich aber schon, das er auf richtigkeit prüfen kann:

    struct calculator : public boost::spirit::grammar<calculator>
    {
        template <typename Scanner>
        struct definition
        {
            boost::spirit::rule<Scanner> TERM, p_sign, m_sign, multi_sign, divide_sign, any_sign, partial_term;
    
            definition(calculator const& self)
            {
                using namespace boost::spirit;
                TERM = real_p >> *partial_term;
                partial_term = any_sign >> real_p;
                m_sign = ch_p("-");
                p_sign = ch_p("+");
                multi_sign = ch_p("*");
                divide_sign = ch_p("/");
                any_sign = m_sign | p_sign | multi_sign | divide_sign;
            }
    
            boost::spirit::rule<Scanner> const& start()
            {
                return TERM;
            }
        };
    };
    

    (bitte nicht weinen, du weisst ja)

    Edit: Ah, Stop! Jetzt auch mit Klammern. 🕶

    struct calculator : public boost::spirit::grammar<calculator>
    {
        template <typename Scanner>
        struct definition
        {
            boost::spirit::rule<Scanner> term, object,  p_sign, m_sign, multi_sign, divide_sign, any_sign, brace_enclosed_expression;
    
            definition(calculator const& self)
            {
                using namespace boost::spirit;
    
                object = brace_enclosed_expression | real_p;
                brace_enclosed_expression = ch_p("(") >> term >> ch_p(")");
                term = object >> *(any_sign >> object);
    
                m_sign = ch_p("-");
                p_sign = ch_p("+");
                multi_sign = ch_p("*");
                divide_sign = ch_p("/");
    
                any_sign = m_sign | p_sign | multi_sign | divide_sign;
            }
    
            boost::spirit::rule<Scanner> const& start()
            {
                return term;
            }
        };
    };
    


  • Sowas ist doch ohne den ganzen Spirit-Ballast viel einfacher.
    Einfach eine Funktion schreiben, die für einen beliebigen Ausdruck einen AST erzeugt und im Falle von Klammern rekursiv weitere ASTs erzeugen.

    Dann kann man sogar super Gleichungen/Tautologien/Contradictionen etc Lösen. 😉

    Hab mir ein kleines Tool gebaut, das logische Propositionen parsed und umformt. Hat an der Uni in Einführung Logik ungefähr das erste halbe Semester sämtliche Beweise machen können, sowas macht Spaß. 😃



  • Rechner gibt es ja wie Sand am Meer. Macht das doch mal zur Compile-Time, mit Templates, so dass folgendes geht:

    calculate<decltype(make_string("3+4+(5*3)")>::value
    

    Oder noch besser:

    std::map<char, float> values;
    values['y'] = 3;
    values['v'] = 4;
    values['z'] = 5;
    solve<decltype(make_string("yx+z = v") ), 'x'>::calculateWith(values);
    

    😃



  • 314159265358979 schrieb:

    cooky451 schrieb:

    👍 Ging recht flott für einen Anfänger. Bin gespannt ob er auch den Parser mit Punkt-Vor-Strich-Rechnung packt!

    Meinen ersten funktionstüchtigen Mathe-Parser hab ich vor geschätzt einem halben Jahr geschrieben. Ich tippe darauf, dass er das nicht schafft.

    Er hat ja wahrscheinlich auch keine Zeitmaschine.



  • Thema erschien ernsthaft. Die bisherigen Antworten scheinen aus Norwegen zu stammen, wo die Trolle wohnen. 😮



  • ich habe es aus der Not heraus gelernt. Ich hatte ein Problem und musste dann etwas programmieren.


Anmelden zum Antworten