private function scanNumericLiteral()

in experiments/Lexer.php [378:429]


    private function scanNumericLiteral($text, & $pos, $endOfFilePos) : int {
        if ($this->isBinaryLiteralStart($text, $pos, $endOfFilePos)) {
            $pos+=2;
            $prevPos = $pos;
            $isValidBinaryLiteral = $this->scanBinaryLiteral($text, $pos, $endOfFilePos);
            if ($prevPos === $pos || !$isValidBinaryLiteral) {
                // invalid binary literal
                return TokenKind::InvalidBinaryLiteral;
            }
            return TokenKind::BinaryLiteralToken;
        } elseif ($this->isHexadecimalLiteralStart($text, $pos, $endOfFilePos)) {
            $pos += 2;
            $prevPos = $pos;
            $isValidHexLiteral = $this->scanHexadecimalLiteral($text, $pos, $endOfFilePos);
            if ($prevPos === $pos || !$isValidHexLiteral) {
                return TokenKind::InvalidHexadecimalLiteral;
                // invalid hexadecimal literal
            }
            return TokenKind::HexadecimalLiteralToken;
        } elseif ($this->isDigitChar(ord($text[$pos])) || $text[$pos] === ".") {
            // TODO throw error if there is no number past the dot.
            $prevPos = $pos;
            $isValidFloatingLiteral = $this->scanFloatingPointLiteral($text, $pos, $endOfFilePos);

            if ($isValidFloatingLiteral) {
                return TokenKind::FloatingLiteralToken;
            }

            // Reset, try scanning octal literal
            $pos = $prevPos;

            if ($text[$pos] === "0") {
                $isValidOctalLiteral = $this->scanOctalLiteral($text, $pos, $endOfFilePos);

                // Check that it's not a 0 decimal literal
                if ($pos === $prevPos+1) {
                    return TokenKind::DecimalLiteralToken;
                }

                if (!$isValidOctalLiteral) {
                    return TokenKind::InvalidOctalLiteralToken;
                }

                return TokenKind::OctalLiteralToken;
            }

            $this->scanDecimalLiteral($text, $pos, $endOfFilePos);
            return TokenKind::DecimalLiteralToken;
        }
        // TODO throw error
        return TokenKind::Unknown;
    }