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