-
Notifications
You must be signed in to change notification settings - Fork 34
/
Lexer.php
157 lines (139 loc) · 4.58 KB
/
Lexer.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<?php
namespace PHPStamp\Processor;
use Doctrine\Common\Lexer\AbstractLexer;
class Lexer extends AbstractLexer
{
const T_NONE = 1;
const T_INTEGER = 2;
const T_STRING = 3;
const T_INPUT_PARAMETER = 4;
const T_FLOAT = 5;
const T_CLOSE_PARENTHESIS = 6;
const T_OPEN_PARENTHESIS = 7;
const T_COMMA = 8;
const T_DIVIDE = 9;
const T_DOT = 10;
const T_EQUALS = 11;
const T_GREATER_THAN = 12;
const T_LOWER_THAN = 13;
const T_MINUS = 14;
const T_MULTIPLY = 15;
const T_NEGATE = 16;
const T_PLUS = 17;
const T_OPEN_CURLY_BRACE = 18;
const T_CLOSE_CURLY_BRACE = 19;
const T_COLON = 20;
const T_OPEN_BRACKET = 100;
const T_CLOSE_BRACKET = 101;
private $brackets = array();
private $bracketsQuery = '';
public function __construct(array $brackets)
{
$this->brackets = $brackets;
$toQuery = array(
'(?:' . preg_quote($this->brackets[0]) . ')',
'(?:' . preg_quote($this->brackets[1]) . ')'
);
$this->bracketsQuery = implode($toQuery);
}
/**
* Lexical catchable patterns.
*
* @return array
*/
protected function getCatchablePatterns()
{
return array(
'[a-z_\\\][a-z0-9_\\\]*[a-z0-9_]{1}',
'(?:[0-9]+(?:[\.][0-9]+)*)(?:e[+-]?[0-9]+)?',
"'(?:[^']|''|')*'", // Паттерн исключает слова в кавычках (только). Доработка - |'
'\?[0-9]*|[a-z_][a-z0-9_]*' ,
/**
* Паттерн включает слова начинающиеся не с цифры и >= 2 символов
* O xxx xx1 _xx
* X 1xx x -xx
*/
/*'[a-z_\s][a-z0-9_\s]*[a-z0-9_\s]{1}',*/
'\[\[',
'\]\]'
);
}
/**
* Lexical non-catchable patterns.
*
* @return array
*/
protected function getNonCatchablePatterns()
{
return array('\s+', '(.)');
}
/**
* Retrieve token type. Also processes the token value if necessary.
*
* @param string $value
*
* @return integer
*/
protected function getType(&$value)
{
switch (true) {
// Заданные брекеты
case ($value === $this->brackets[0]):
return self::T_OPEN_BRACKET;
case ($value === $this->brackets[1]):
return self::T_CLOSE_BRACKET;
// Знаки
case ($value === '.'):
return self::T_DOT;
case ($value === ','):
return self::T_COMMA;
case ($value === '('):
return self::T_OPEN_PARENTHESIS;
case ($value === ')'):
return self::T_CLOSE_PARENTHESIS;
case ($value === '='):
return self::T_EQUALS;
case ($value === '>'):
return self::T_GREATER_THAN;
case ($value === '<'):
return self::T_LOWER_THAN;
case ($value === '+'):
return self::T_PLUS;
case ($value === '-'):
return self::T_MINUS;
case ($value === '*'):
return self::T_MULTIPLY;
case ($value === '/'):
return self::T_DIVIDE;
case ($value === '!'):
return self::T_NEGATE;
case ($value === '{'):
return self::T_OPEN_CURLY_BRACE;
case ($value === '}'):
return self::T_CLOSE_CURLY_BRACE;
case ($value === ':'):
return self::T_COLON;
case (is_string($value)):
return self::T_STRING;
default:
return self::T_NONE;
}
}
/**
* Substr original lexer's input.
*
* @param integer $length
* @param integer $position
*
* @return string
*/
public function getInputBetweenPosition($position, $length)
{
// Get input without modification of original package
$reflectionClass = new \ReflectionClass('Doctrine\Common\Lexer\AbstractLexer');
$reflectionProperty = $reflectionClass->getProperty('input');
$reflectionProperty->setAccessible(true);
$input = $reflectionProperty->getValue($this);
return mb_substr($input, $position, $length);
}
}