HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/kommabasic.nl/vendor/phpbench/phpbench/lib/Assertion/ExpressionLexer.php
<?php

namespace PhpBench\Assertion;

use Doctrine\Common\Lexer\AbstractLexer;

class ExpressionLexer extends AbstractLexer
{
    public const T_NONE = 'none';
    public const T_INTEGER = 'integer';
    public const T_FLOAT = 'float';
    public const T_TOLERANCE = 'tolerance';
    public const T_DOT = 'dot';
    public const T_COMPARATOR = 'comparator';
    public const T_PROPERTY_ACCESS = 'property_access';
    public const T_UNIT = 'unit';
    public const T_PERCENTAGE = 'percentage';

    private const PATTERN_PROPERTY_ACCESS = '(?:[a-z_][a-z0-9_]+\.[a-z_][a-z0-9_]+\.?)+';
    private const PATTERN_COMPARATORS = '(?:<=|>=|<|=|>)';
    private const UNIT = '(?:[a-z\/]+)';
    private const PATTERN_TOLERANCE = '(?:\+\/\-)';

    public function __construct(string $input)
    {
        $this->setInput($input);
    }

    /**
     * {@inheritDoc}
     */
    protected function getCatchablePatterns(): array
    {
        return [
            self::PATTERN_TOLERANCE, // comparators
            self::PATTERN_COMPARATORS, // comparators
            '(?:[0-9]+(?:[\.][0-9]+)*)(?:e[+-]?[0-9]+)?', // numbers
            self::PATTERN_PROPERTY_ACCESS,
            self::UNIT, // names
            '%',
        ];
    }

    /**
     * {@inheritDoc}
     */
    protected function getNonCatchablePatterns(): array
    {
        return ['\s+'];
    }

    /**
     * {@inheritDoc}
     */
    protected function getType(&$value)
    {
        $type = self::T_NONE;

        switch (true) {
            case (is_numeric($value)):
                if (strpos($value, '.') !== false || stripos($value, 'e') !== false) {
                    return self::T_FLOAT;
                }

                return self::T_INTEGER;
            case $value === '+/-':
                return self::T_TOLERANCE;
            case (preg_match('{'. self::PATTERN_PROPERTY_ACCESS . '}', $value)):
                return self::T_PROPERTY_ACCESS;

            case (preg_match('{'. self::PATTERN_COMPARATORS. '}', $value)):
                return self::T_COMPARATOR;
            case (preg_match('{'. self::UNIT. '}', $value)):
                return self::T_UNIT;
            case $value === '%':
                return self::T_PERCENTAGE;
        }

        return $type;
    }
}