Пример #1
0
void button_clicked (GtkWidget *widget, gpointer data) {
    char ch = *((char *) data);
    char *str;
    
    /* --- Get the button label --- */
    str = (char *) data;

    /* --- Entering a number... --- */
    if (floatingPointChar (ch) && strlen (str) == 1) {

        handleDigit (str, ch);

    } else {

        /* --- Clear? --- */
        if (strcmp (str, "CE") == 0) {
            gtk_label_set_text (GTK_LABEL (label), "0");
            return;

        /* --- BIG clear? --- */
        } else if (strcmp (str, "C") == 0) {
            prevCmd = (char) 0;
            lastChar = (char) 0;
            gtk_label_set_text (GTK_LABEL (label), "0");
            return;

        } else {

            /* --- Maybe it's a unary operator? --- */
            maybeUnaryOperation (str);
        }

        /* --- See if there's a binary operation to do --- */
        handleBinaryOperation ();

        prevCmd = ch;
    }
    lastChar = ch;
}
Пример #2
0
    void Scanner::handleNumberState()
    {
        loc_ = getTokenLocation();
        bool matched = false;
        bool isFloat = false;
        int numberBase = 10;

        if (currentChar_ == '$')
        {
            numberBase = 16;
            // eat $ and update currentChar_
            getNextChar();
        }

        enum class NumberState
        {
            INTERGER,
            FRACTION,
            EXPONENT,
            DONE
        };
        NumberState numberState = NumberState::INTERGER;

        do
        {
            switch (numberState)
            {
                case NumberState::INTERGER:
                    if (numberBase == 10)
                    {
                        handleDigit();
                    }
                    else if (numberBase == 16)
                    {
                        handleXDigit();
                    }

                    // maybe want to support octal...
                    break;

                case NumberState::FRACTION:
                    handleFraction();
                    isFloat = true;
                    break;

                case NumberState::EXPONENT:
                    handleExponent();
                    isFloat = true;
                    break;

                case NumberState::DONE:
                    break;

                default:
                    errorToken("Match number state error.");
                    errorFlag_ = true;
                    break;
            }

            // change number state
            if (currentChar_ == '.')
            {
                numberState = NumberState::FRACTION;
            }
            else if (currentChar_ == 'E' || currentChar_ == 'e')
            {
                numberState = NumberState::EXPONENT;
            }
            else
            {
                numberState = NumberState::DONE;
            }
        }
        while (numberState != NumberState::DONE);

        if (isFloat)
        {
            makeToken(TokenType::REAL, TokenValue::UNRESERVED, loc_,
                      std::stod(buffer_), buffer_);
        }
        else
        {
            makeToken(TokenType::INTEGER, TokenValue::UNRESERVED, loc_,
                      std::stol(buffer_, 0, numberBase), buffer_);
        }
    }