Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. Scanner.php

function Scanner::scanNumber

Number scanning method

Return value

Token|null

1 call to Scanner::scanNumber()
Scanner::getToken in vendor/mck89/peast/lib/Peast/Syntax/Scanner.php
Returns the current token

File

vendor/mck89/peast/lib/Peast/Syntax/Scanner.php, line 1424

Class

Scanner
Base class for scanners.

Namespace

Peast\Syntax

Code

protected function scanNumber() {
    
    //Numbers can start with a decimal number or with a dot (.5)
    $char = $this->charAt();
    if (!($char >= "0" && $char <= "9" || $char === ".")) {
        return null;
    }
    $buffer = "";
    $allowedDecimals = true;
    
    //Parse the integer part
    if ($char !== ".") {
        
        //Consume all decimal numbers
        $buffer = $this->consumeNumbers();
        $char = $this->charAt();
        if ($this->features->bigInt && $char === "n") {
            $this->index++;
            $this->column++;
            return new Token(Token::TYPE_BIGINT_LITERAL, $buffer . $char);
        }
        $lower = $char !== null ? strtolower($char) : null;
        
        //Handle hexadecimal (0x), octal (0o) and binary (0b) forms
        if ($buffer === "0" && $lower !== null && isset($this->{$lower . "numbers"})) {
            $this->index++;
            $this->column++;
            $tempBuffer = $this->consumeNumbers($lower);
            if ($tempBuffer === null) {
                $this->error("Missing numbers after 0{$char}");
            }
            $buffer .= $char . $tempBuffer;
            
            //Check that there are not numbers left
            if ($this->consumeNumbers() !== null) {
                $this->error();
            }
            if ($this->features->bigInt && $this->charAt() === "n") {
                $this->index++;
                $this->column++;
                return new Token(Token::TYPE_BIGINT_LITERAL, $buffer . $char);
            }
            return new Token(Token::TYPE_NUMERIC_LITERAL, $buffer);
        }
        
        //Consume exponent part if present
        if ($tempBuffer = $this->consumeExponentPart()) {
            $buffer .= $tempBuffer;
            $allowedDecimals = false;
        }
    }
    
    //Parse the decimal part
    if ($allowedDecimals && $this->charAt() === ".") {
        
        //Consume the dot
        $this->index++;
        $this->column++;
        $buffer .= ".";
        
        //Consume all decimal numbers
        $tempBuffer = $this->consumeNumbers();
        $buffer .= $tempBuffer;
        
        //If the buffer contains only the dot it should be parsed as
        
        //punctuator
        if ($buffer === ".") {
            $this->index--;
            $this->column--;
            return null;
        }
        
        //Consume exponent part if present
        if (($tempBuffer = $this->consumeExponentPart()) !== null) {
            $buffer .= $tempBuffer;
        }
    }
    return new Token(Token::TYPE_NUMERIC_LITERAL, $buffer);
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal