예제 #1
0
void IRCSession::makepolishform(string szam)
{
    string s = szam;
    q = TokenQueue();
    sk = TokenStack();
    CalcLexer cl = CalcLexer(s);
    Token t;
    do
    {
        if(t.tkntype == TKN_NEXT_LINE)
            cl = CalcLexer(s);

        t = cl.getNextToken();
        if(t.tkntype == TKN_NUMBER || t.tkntype == TKN_NAME)
            q.put(t);
        else if(t.tkntype == TKN_OPEN_PAR)
            sk.put(t);
        else if(t.tkntype == TKN_CLOSE_PAR)
        {
            Token t1;
            while(!sk.empty() && sk.seek().tkntype != TKN_OPEN_PAR)
                q.put(sk.get());

            sk.get();
        }
        else if(t.tkntype == TKN_OPERATOR)
        {
            while(!sk.empty() && getpriority(sk.seek()) <= getpriority(t))
                q.put(sk.get());

            sk.put(t);
        }
    } while(t.tkntype != TKN_TERMINATION);

    while(!sk.empty())
        q.put(sk.get());
}
예제 #2
0
void IRCSession::calculate(string privmsg)
{
    sk = TokenStack();
    while(!q.empty())
    {
        Token t = q.get();
        if(t.tkntype == TKN_NUMBER || t.tkntype == TKN_NAME)
            sk.put(t);
        else if(t.tkntype == TKN_OPERATOR)
        {
            if(t.str == "+")
            {
                Token o1, o2;
                if(!sk.empty() && (sk.seek().tkntype == TKN_NUMBER || sk.seek().tkntype == TKN_NAME))
                    o2 = getValue(sk.get());

                if(!sk.empty() && (sk.seek().tkntype == TKN_NUMBER || sk.seek().tkntype == TKN_NAME))
                    o1 = getValue(sk.get());

                Token e = Token(TKN_NUMBER, o1.number+o2.number, "");
                sk.put(e);
            }
            else if(t.str == "-")
            {
                Token o1, o2;
                if(!sk.empty() && (sk.seek().tkntype == TKN_NUMBER || sk.seek().tkntype == TKN_NAME))
                    o2 = getValue(sk.get());

                if(!sk.empty() && (sk.seek().tkntype == TKN_NUMBER || sk.seek().tkntype == TKN_NAME))
                    o1 = getValue(sk.get());

                Token e = Token(TKN_NUMBER, o1.number-o2.number, "");
                sk.put(e);
            }
            else if(t.str == "*")
            {
                Token o1, o2;
                if(!sk.empty() && (sk.seek().tkntype == TKN_NUMBER || sk.seek().tkntype == TKN_NAME))
                    o2 = getValue(sk.get());

                if(!sk.empty() && (sk.seek().tkntype == TKN_NUMBER || sk.seek().tkntype == TKN_NAME))
                    o1 = getValue(sk.get());

                Token e = Token(TKN_NUMBER, o1.number*o2.number, "");
                sk.put(e);
            }
            else if(t.str == "/")
            {
                Token o1, o2;
                if(!sk.empty() && (sk.seek().tkntype == TKN_NUMBER || sk.seek().tkntype == TKN_NAME))
                    o2 = getValue(sk.get());

                if(!sk.empty() && (sk.seek().tkntype == TKN_NUMBER || sk.seek().tkntype == TKN_NAME))
                    o1 = getValue(sk.get());

                Token e = Token(TKN_NUMBER, o1.number/o2.number, "");
                sk.put(e);
            }
            else if(t.str == "%")
            {
                Token o1, o2;
                if(!sk.empty() && (sk.seek().tkntype == TKN_NUMBER || sk.seek().tkntype == TKN_NAME))
                    o2 = getValue(sk.get());

                if(!sk.empty() && (sk.seek().tkntype == TKN_NUMBER || sk.seek().tkntype == TKN_NAME))
                    o1 = getValue(sk.get());

                Token e = Token(TKN_NUMBER, cast_int(o1.number)%cast_int(o2.number), "");
                sk.put(e);
            }
            else if(t.str == "^" || t.str == "**")
            {
                Token o1, o2;
                if(!sk.empty() && (sk.seek().tkntype == TKN_NUMBER || sk.seek().tkntype == TKN_NAME))
                    o2 = getValue(sk.get());

                if(!sk.empty() && (sk.seek().tkntype == TKN_NUMBER || sk.seek().tkntype == TKN_NAME))
                    o1 = getValue(sk.get());

                Token e = Token(TKN_NUMBER, pow(o1.number, o2.number), "");
                sk.put(e);
            }
            /*else if(t.str == "sin")
            {
            	Token o1, o2;
            	if(!sk.empty() && (sk.seek().tkntype == TKN_NUMBER || sk.seek().tkntype == TKN_NAME))
            		o2 = getValue(sk.get());

            	if(!sk.empty() && (sk.seek().tkntype == TKN_NUMBER || sk.seek().tkntype == TKN_NAME))
            		o1 = getValue(sk.get());

            	Token e = Token(TKN_NUMBER, sin(12), "");
            	sk.put(e);
            }*/
        }
    }

    double d;

    if(!sk.empty())
        d = getValue(sk.get()).number;
    else
        d = 0.0f;

    if(d-cast_int(d) < 0.00000049)
        SendChatMessage(PRIVMSG, privmsg.c_str(), "%d", cast_int(d));
    else
        SendChatMessage(PRIVMSG, privmsg.c_str(), "%f", d);

    varv.clear();
}