39 '/^(\\\)/' => self::T_ESCAPE,
40 '/^(\")/' => self::T_QUOTE,
41 '/^(\s+)/' => self::T_WHITESPACE,
42 '/^(OR)/' => self::T_OR,
43 '/^(AND)/' => self::T_AND,
44 '/^(\()/' => self::T_OPEN_PARENTHESIS,
45 '/^(\))/' => self::T_CLOSE_PARENTHESIS,
46 '/^(\*(?=\s|\z))/' => self::T_STAR_END,
47 '/^(\*)/' => self::T_STAR_BEGIN,
49 '/^([\p{L}\']?[\p{L}\p{N}]+(?:-[\p{L}][\p{L}\p{N}]*)?)/u' => self::T_WORD,
50 '/^([\p{P}\p{S}])/u' => self::T_PUNCTUATION,
64 public static function analyze($source, $onlyToken =
false)
68 while ($offset < strlen($source)) {
69 $result = static::_match($source, $offset);
70 if ($result ===
false) {
71 throw new LexException(sprintf(_(
"LEX_GENERAL_FILTER:Unable to parse %s") , $source));
74 $offset+= strlen($result[
'match']);
79 return static::_convertToken($tokens);
89 protected static function _match($line, $offset)
91 $string = substr($line, $offset);
93 foreach (static::$_terminals as $pattern => $name) {
94 if (preg_match($pattern, $string, $matches)) {
96 'match' => $matches[1],
114 $currentMode =
false;
119 foreach ($tokens as
$value) {
121 if ($currentMode ===
false) {
122 $currentMode = self::MODE_STRING;
124 if ($currentMode == self::MODE_WORD) {
127 $currentWord.= $value[
"match"];
131 if ($value[
"token"] === self::T_ESCAPE) {
135 if ($value[
"token"] === self::T_QUOTE) {
137 if ($currentMode ===
false) {
138 $currentMode = self::MODE_STRING;
140 }
else if ($currentMode === self::MODE_STRING) {
142 "word" => $currentWord,
143 "mode" => self::MODE_STRING
146 $currentMode =
false;
148 $currentWord.= $value[
"match"];
152 if ($currentMode === self::MODE_STRING && $inQuote) {
153 $currentWord.= $value[
"match"];
156 if ($value[
"token"] === self::T_WHITESPACE) {
157 if ($currentWord !==
"") {
159 "word" => $currentWord,
160 "mode" => $currentMode
164 $currentMode =
false;
167 if ($value[
"token"] === self::T_STAR_BEGIN) {
168 if ($currentMode ===
false) {
169 $currentMode = self::MODE_PARTIAL_BEGIN;
171 $currentWord.= $value[
"match"];
174 if ($value[
"token"] === self::T_STAR_END) {
175 if ($currentMode ===
false || $currentMode === self::MODE_WORD) {
176 $currentMode = self::MODE_PARTIAL_END;
177 }
else if ($currentMode === self::MODE_PARTIAL_BEGIN) {
178 $currentMode = self::MODE_PARTIAL_BOTH;
181 if ($value[
"token"] === self::T_OPEN_PARENTHESIS) {
183 "mode" => self::MODE_OPEN_PARENTHESIS
187 if ($value[
"token"] === self::T_CLOSE_PARENTHESIS) {
188 if ($currentWord !==
"") {
190 "word" => $currentWord,
191 "mode" => $currentMode ? $currentMode : self::MODE_WORD
196 "mode" => self::MODE_CLOSE_PARENTHESIS
200 if ($value[
"token"] === self::T_OR) {
202 "mode" => self::MODE_OR
206 if ($value[
"token"] === self::T_AND) {
208 "mode" => self::MODE_AND
212 if ($value[
"token"] === self::T_WORD) {
213 if ($currentMode ===
false) {
214 $currentMode = self::MODE_WORD;
216 $currentWord.= $value[
"match"];
218 if ($value[
"token"] === self::T_PUNCTUATION) {
219 if ($currentMode ===
false || $currentMode === self::MODE_WORD) {
220 $currentMode = self::MODE_STRING;
222 $currentWord.= $value[
"match"];
225 if ($currentWord !==
"") {
227 "word" => $currentWord,
228 "mode" => $currentMode
Exception class use exceptionCode to identifiy correctly exception.
const MODE_CLOSE_PARENTHESIS
static analyze($source, $onlyToken=false)
const MODE_OPEN_PARENTHESIS
static _convertToken($tokens)
static _match($line, $offset)
const T_CLOSE_PARENTHESIS