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; }
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_); } }