protected function buildNumberToken(Token $token, Character $char) { $token->setType(TokenType::INTEGER); $buffer = ''; do { $buffer .= $char->getValue(); try { $char = $this->getCharacter(); } catch (EofException $e) { throw new SyntaxException($char->getLine(), $char->getColumn() - mb_strlen($buffer) + 1, "Found EOF reading number: '{$buffer}'", __FILE__, __LINE__); } } while ($char->isNumber() || $char->getValue() == '.'); $this->ungetCharacter(); // If number contains a period, is a FLOAT if (mb_strpos($buffer, '.') !== FALSE) { $token->setType(TokenType::FLOAT); // If period is not followed by numbers if (mb_substr($buffer, -1) == '.') { throw new SyntaxException($token->getLine(), $token->getColumn(), "Invalid FLOAT value: '{$buffer}'", __FILE__, __LINE__); } } switch ($token->getType()) { case TokenType::FLOAT: $token->setValue(floatval($buffer)); break; case TokenType::INTEGER: $token->setValue(intval($buffer)); break; default: throw new SyntaxException($char->getLine(), $char->getColumn(), 'Unknown number token type: "' . $buffer . '"', __FILE__, __LINE__); break; } return $token; }