summaryrefslogtreecommitdiffstats
path: root/src/Token.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/Token.php')
-rw-r--r--src/Token.php117
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;
}