diff options
Diffstat (limited to 'src/Token.php')
-rw-r--r-- | src/Token.php | 117 |
1 files changed, 60 insertions, 57 deletions
diff --git a/src/Token.php b/src/Token.php index e5001ef..d847224 100644 --- a/src/Token.php +++ b/src/Token.php @@ -4,9 +4,8 @@ * Defines a token along with a set of types and flags and utility functions. * * An array of tokens will result after parsing the query. - * - * @package SqlParser */ + namespace SqlParser; /** @@ -14,12 +13,11 @@ namespace SqlParser; * categorization for the purpose of parsing. * * @category Tokens - * @package SqlParser + * * @license https://www.gnu.org/licenses/gpl-2.0.txt GPL-2.0+ */ class Token { - // Types of tokens (a vague description of a token's purpose). /** @@ -29,14 +27,14 @@ class Token * * @var int */ - const TYPE_NONE = 0; + const TYPE_NONE = 0; /** * SQL specific keywords: SELECT, UPDATE, INSERT, etc. * * @var int */ - const TYPE_KEYWORD = 1; + const TYPE_KEYWORD = 1; /** * Any type of legal operator. @@ -50,14 +48,14 @@ class Token * * @var int */ - const TYPE_OPERATOR = 2; + const TYPE_OPERATOR = 2; /** * Spaces, tabs, new lines, etc. * * @var int */ - const TYPE_WHITESPACE = 3; + const TYPE_WHITESPACE = 3; /** * Any type of legal comment. @@ -79,21 +77,21 @@ class Token * * @var int */ - const TYPE_COMMENT = 4; + const TYPE_COMMENT = 4; /** * Boolean values: true or false. * * @var int */ - const TYPE_BOOL = 5; + const TYPE_BOOL = 5; /** * Numbers: 4, 0x8, 15.16, 23e42, etc. * * @var int */ - const TYPE_NUMBER = 6; + const TYPE_NUMBER = 6; /** * Literal strings: 'string', "test". @@ -101,15 +99,15 @@ class Token * * @var int */ - const TYPE_STRING = 7; + const TYPE_STRING = 7; /** * Database, table names, variables, etc. - * For example: ```SELECT `foo`, `bar` FROM `database`.`table`;``` + * For example: ```SELECT `foo`, `bar` FROM `database`.`table`;```. * * @var int */ - const TYPE_SYMBOL = 8; + const TYPE_SYMBOL = 8; /** * Delimits an unknown string. @@ -117,7 +115,7 @@ class Token * * @var int */ - const TYPE_DELIMITER = 9; + const TYPE_DELIMITER = 9; /** * Labels in LOOP statement, ITERATE statement etc. @@ -125,50 +123,50 @@ class Token * begin_label: BEGIN [statement_list] END [end_label] * begin_label: LOOP [statement_list] END LOOP [end_label] * begin_label: REPEAT [statement_list] ... END REPEAT [end_label] - * begin_label: WHILE ... DO [statement_list] END WHILE [end_label] + * begin_label: WHILE ... DO [statement_list] END WHILE [end_label]. * * @var int */ - const TYPE_LABEL = 10; + const TYPE_LABEL = 10; // Flags that describe the tokens in more detail. // All keywords must have flag 1 so `Context::isKeyword` method doesn't // require strict comparison. - const FLAG_KEYWORD_RESERVED = 2; - const FLAG_KEYWORD_COMPOSED = 4; - const FLAG_KEYWORD_DATA_TYPE = 8; - const FLAG_KEYWORD_KEY = 16; - const FLAG_KEYWORD_FUNCTION = 32; + const FLAG_KEYWORD_RESERVED = 2; + const FLAG_KEYWORD_COMPOSED = 4; + const FLAG_KEYWORD_DATA_TYPE = 8; + const FLAG_KEYWORD_KEY = 16; + const FLAG_KEYWORD_FUNCTION = 32; // Numbers related flags. - const FLAG_NUMBER_HEX = 1; - const FLAG_NUMBER_FLOAT = 2; - const FLAG_NUMBER_APPROXIMATE = 4; - const FLAG_NUMBER_NEGATIVE = 8; - const FLAG_NUMBER_BINARY = 16; + const FLAG_NUMBER_HEX = 1; + const FLAG_NUMBER_FLOAT = 2; + const FLAG_NUMBER_APPROXIMATE = 4; + const FLAG_NUMBER_NEGATIVE = 8; + const FLAG_NUMBER_BINARY = 16; // Strings related flags. - const FLAG_STRING_SINGLE_QUOTES = 1; - const FLAG_STRING_DOUBLE_QUOTES = 2; + const FLAG_STRING_SINGLE_QUOTES = 1; + const FLAG_STRING_DOUBLE_QUOTES = 2; // Comments related flags. - const FLAG_COMMENT_BASH = 1; - const FLAG_COMMENT_C = 2; - const FLAG_COMMENT_SQL = 4; - const FLAG_COMMENT_MYSQL_CMD = 8; + const FLAG_COMMENT_BASH = 1; + const FLAG_COMMENT_C = 2; + const FLAG_COMMENT_SQL = 4; + const FLAG_COMMENT_MYSQL_CMD = 8; // Operators related flags. - const FLAG_OPERATOR_ARITHMETIC = 1; - const FLAG_OPERATOR_LOGICAL = 2; - const FLAG_OPERATOR_BITWISE = 4; - const FLAG_OPERATOR_ASSIGNMENT = 8; - const FLAG_OPERATOR_SQL = 16; + const FLAG_OPERATOR_ARITHMETIC = 1; + const FLAG_OPERATOR_LOGICAL = 2; + const FLAG_OPERATOR_BITWISE = 4; + const FLAG_OPERATOR_ASSIGNMENT = 8; + const FLAG_OPERATOR_SQL = 16; // Symbols related flags. - const FLAG_SYMBOL_VARIABLE = 1; - const FLAG_SYMBOL_BACKTICK = 2; - const FLAG_SYMBOL_USER = 4; - const FLAG_SYMBOL_SYSTEM = 8; + const FLAG_SYMBOL_VARIABLE = 1; + const FLAG_SYMBOL_BACKTICK = 2; + const FLAG_SYMBOL_USER = 4; + const FLAG_SYMBOL_SYSTEM = 8; /** * The token it its raw string representation. @@ -178,7 +176,7 @@ class Token public $token; /** - * The value this token contains (i.e. token after some evaluation) + * The value this token contains (i.e. token after some evaluation). * * @var mixed */ @@ -208,9 +206,9 @@ class Token /** * Constructor. * - * @param string $token The value of the token. - * @param int $type The type of the token. - * @param int $flags The flags of the token. + * @param string $token the value of the token + * @param int $type the type of the token + * @param int $flags the flags of the token */ public function __construct($token, $type = 0, $flags = 0) { @@ -230,40 +228,43 @@ class Token public function extract() { switch ($this->type) { - case Token::TYPE_KEYWORD: - if (!($this->flags & Token::FLAG_KEYWORD_RESERVED)) { + case self::TYPE_KEYWORD: + if (!($this->flags & self::FLAG_KEYWORD_RESERVED)) { // Unreserved keywords should stay the way they are because they // might represent field names. return $this->token; } + return strtoupper($this->token); - case Token::TYPE_WHITESPACE: + case self::TYPE_WHITESPACE: return ' '; - case Token::TYPE_BOOL: + case self::TYPE_BOOL: return strtoupper($this->token) === 'TRUE'; - case Token::TYPE_NUMBER: + case self::TYPE_NUMBER: $ret = str_replace('--', '', $this->token); // e.g. ---42 === -42 - if ($this->flags & Token::FLAG_NUMBER_HEX) { - if ($this->flags & Token::FLAG_NUMBER_NEGATIVE) { + if ($this->flags & self::FLAG_NUMBER_HEX) { + if ($this->flags & self::FLAG_NUMBER_NEGATIVE) { $ret = str_replace('-', '', $this->token); sscanf($ret, '%x', $ret); $ret = -$ret; } else { sscanf($ret, '%x', $ret); } - } elseif (($this->flags & Token::FLAG_NUMBER_APPROXIMATE) - || ($this->flags & Token::FLAG_NUMBER_FLOAT) + } elseif (($this->flags & self::FLAG_NUMBER_APPROXIMATE) + || ($this->flags & self::FLAG_NUMBER_FLOAT) ) { sscanf($ret, '%f', $ret); } else { sscanf($ret, '%d', $ret); } + return $ret; - case Token::TYPE_STRING: + case self::TYPE_STRING: $quote = $this->token[0]; $str = str_replace($quote . $quote, $quote, $this->token); + return mb_substr($str, 1, -1, 'UTF-8'); // trims quotes - case Token::TYPE_SYMBOL: + case self::TYPE_SYMBOL: $str = $this->token; if ((isset($str[0])) && ($str[0] === '@')) { // `mb_strlen($str)` must be used instead of `null` because @@ -282,8 +283,10 @@ class Token $str = str_replace($quote . $quote, $quote, $str); $str = mb_substr($str, 1, -1, 'UTF-8'); } + return $str; } + return $this->token; } |