PageRenderTime 27ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/lib/Opt/Expression/Standard/Lexer.php

https://github.com/OPL/Open-Power-Template
PHP | 503 lines | 393 code | 64 blank | 46 comment | 11 complexity | bf676e394b33fae62ae006bbb1bece48 MD5 | raw file
  1. <?php
  2. /*
  3. * OPEN POWER LIBS <http://www.invenzzia.org>
  4. *
  5. * This file is subject to the new BSD license that is bundled
  6. * with this package in the file LICENSE. It is also available through
  7. * WWW at this URL: <http://www.invenzzia.org/license/new-bsd>
  8. *
  9. * Copyright (c) Invenzzia Group <http://www.invenzzia.org>
  10. * and other contributors. See website for details.
  11. *
  12. */
  13. /**
  14. * The lexer class for the expression parser. Note: this file
  15. * is automatically generated by PHP Parser Generator lexer
  16. * by Gregory Beaver. Do not modify it manually. Instead,
  17. * use the file /tools/lexer/expression_lexer.plex and parse
  18. * it with /tools/lexer/generateExpression.php.
  19. */
  20. class Opt_Expression_Standard_Lexer
  21. {
  22. /**
  23. * The data field for the lexical analyzer.
  24. */
  25. private $_data;
  26. /**
  27. * The token counter for the lexical analyzer.
  28. */
  29. private $_counter;
  30. /**
  31. * The line counter for the lexical analyzer.
  32. */
  33. private $_line;
  34. /**
  35. * The recognized token number for parser.
  36. * @var integer
  37. */
  38. public $token;
  39. /**
  40. * The recognized token value for parser.
  41. * @var string
  42. */
  43. public $value;
  44. /**
  45. * Constructs the lexer object for parsing the specified
  46. * expression.
  47. *
  48. * @param string $expression The expression to parse.
  49. */
  50. public function __construct($expression)
  51. {
  52. $this->_data = $expression;
  53. $this->_line = 1;
  54. $this->_counter = 0;
  55. } // end __construct();
  56. private $_yy_state = 1;
  57. private $_yy_stack = array();
  58. function yylex()
  59. {
  60. return $this->{'yylex' . $this->_yy_state}();
  61. }
  62. function yypushstate($state)
  63. {
  64. array_push($this->_yy_stack, $this->_yy_state);
  65. $this->_yy_state = $state;
  66. }
  67. function yypopstate()
  68. {
  69. $this->_yy_state = array_pop($this->_yy_stack);
  70. }
  71. function yybegin($state)
  72. {
  73. $this->_yy_state = $state;
  74. }
  75. function yylex1()
  76. {
  77. $tokenMap = array (
  78. 1 => 0,
  79. 2 => 1,
  80. 4 => 0,
  81. 5 => 0,
  82. 6 => 0,
  83. 7 => 0,
  84. 8 => 0,
  85. 9 => 0,
  86. 10 => 0,
  87. 11 => 0,
  88. 12 => 0,
  89. 13 => 0,
  90. 14 => 0,
  91. 15 => 0,
  92. 16 => 0,
  93. 17 => 0,
  94. 18 => 0,
  95. 19 => 0,
  96. 20 => 0,
  97. 21 => 0,
  98. 22 => 0,
  99. 23 => 0,
  100. 24 => 0,
  101. 25 => 0,
  102. 26 => 0,
  103. 27 => 0,
  104. 28 => 0,
  105. 29 => 0,
  106. 30 => 0,
  107. 31 => 0,
  108. 32 => 0,
  109. 33 => 0,
  110. 34 => 0,
  111. 35 => 0,
  112. 36 => 0,
  113. 37 => 0,
  114. 38 => 0,
  115. 39 => 0,
  116. 40 => 0,
  117. 41 => 0,
  118. 42 => 0,
  119. 43 => 0,
  120. 44 => 0,
  121. 45 => 0,
  122. );
  123. if ($this->_counter >= strlen($this->_data)) {
  124. return false; // end of input
  125. }
  126. $yy_global_pattern = "/^(\\s+)|^((\\+\\+|--))|^(\\+)|^(-)|^(\\*)|^(\/)|^(%)|^(\\^)|^(!)|^(==)|^(===)|^(!=)|^(!==)|^(~)|^(is\\s+between)|^(is\\s+not\\s+between)|^(is\\s+either)|^(is\\s+neither)|^(contains\\s+both)|^(contains\\s+either)|^(contains\\s+neither)|^(is\\s+in)|^(is\\s+not\\s+in)|^(is\\s+both\\s+in)|^(is\\s+either\\s+in)|^(is\\s+neither\\s+in)|^(\\$)|^(@)|^(\\.)|^(=)|^(\\()|^(\\))|^(<)|^(>)|^(\\[)|^(\\])|^(::)|^(,)|^(:)|^([a-zA-Z_][a-zA-Z0-9_]*)|^('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|^(`[^`\\\\]*(?:\\\\.[^`\\\\]*)*`)|^([0-9]+\\.?[0-9]*)|^(0[xX][0-9a-fA-F]+)/";
  127. do {
  128. if (preg_match($yy_global_pattern, substr($this->_data, $this->_counter), $yymatches)) {
  129. $yysubmatches = $yymatches;
  130. $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
  131. if (!count($yymatches)) {
  132. throw new Exception('Error: lexing failed because a rule matched' .
  133. 'an empty string. Input "' . substr($this->_data,
  134. $this->_counter, 5) . '... state CODE');
  135. }
  136. next($yymatches); // skip global match
  137. $this->token = key($yymatches); // token number
  138. if ($tokenMap[$this->token]) {
  139. // extract sub-patterns for passing to lex function
  140. $yysubmatches = array_slice($yysubmatches, $this->token + 1,
  141. $tokenMap[$this->token]);
  142. } else {
  143. $yysubmatches = array();
  144. }
  145. $this->value = current($yymatches); // token value
  146. $r = $this->{'yy_r1_' . $this->token}($yysubmatches);
  147. if ($r === null) {
  148. $this->_counter += strlen($this->value);
  149. $this->_line += substr_count($this->value, "\n");
  150. // accept this token
  151. return true;
  152. } elseif ($r === true) {
  153. // we have changed state
  154. // process this token in the new state
  155. return $this->yylex();
  156. } elseif ($r === false) {
  157. $this->_counter += strlen($this->value);
  158. $this->_line += substr_count($this->value, "\n");
  159. if ($this->_counter >= strlen($this->_data)) {
  160. return false; // end of input
  161. }
  162. // skip this token
  163. continue;
  164. } } else {
  165. throw new Opt_Expression_Exception('Unexpected input at line '.$this->_line.': '.$this->_data[$this->_counter]);
  166. }
  167. break;
  168. } while (true);
  169. } // end function
  170. const CODE = 1;
  171. function yy_r1_1($yy_subpatterns)
  172. {
  173. $this->token = 'w';
  174. }
  175. function yy_r1_2($yy_subpatterns)
  176. {
  177. if($this->value == '++')
  178. {
  179. $this->token = Opt_Expression_Standard_Parser::T_INCREMENT;
  180. }
  181. else
  182. {
  183. $this->token = Opt_Expression_Standard_Parser::T_DECREMENT;
  184. }
  185. }
  186. function yy_r1_4($yy_subpatterns)
  187. {
  188. $this->token = Opt_Expression_Standard_Parser::T_ADD;
  189. }
  190. function yy_r1_5($yy_subpatterns)
  191. {
  192. $this->token = Opt_Expression_Standard_Parser::T_MINUS;
  193. }
  194. function yy_r1_6($yy_subpatterns)
  195. {
  196. $this->token = Opt_Expression_Standard_Parser::T_MUL;
  197. }
  198. function yy_r1_7($yy_subpatterns)
  199. {
  200. $this->token = Opt_Expression_Standard_Parser::T_DIV;
  201. }
  202. function yy_r1_8($yy_subpatterns)
  203. {
  204. $this->token = Opt_Expression_Standard_Parser::T_MOD;
  205. }
  206. function yy_r1_9($yy_subpatterns)
  207. {
  208. $this->token = Opt_Expression_Standard_Parser::T_EXP;
  209. }
  210. function yy_r1_10($yy_subpatterns)
  211. {
  212. $this->token = Opt_Expression_Standard_Parser::T_NOT;
  213. }
  214. function yy_r1_11($yy_subpatterns)
  215. {
  216. $this->token = Opt_Expression_Standard_Parser::T_EQUALS;
  217. }
  218. function yy_r1_12($yy_subpatterns)
  219. {
  220. $this->token = Opt_Expression_Standard_Parser::T_EQUALS_T;
  221. }
  222. function yy_r1_13($yy_subpatterns)
  223. {
  224. $this->token = Opt_Expression_Standard_Parser::T_NEQUALS;
  225. }
  226. function yy_r1_14($yy_subpatterns)
  227. {
  228. $this->token = Opt_Expression_Standard_Parser::T_NEQUALS_T;
  229. }
  230. function yy_r1_15($yy_subpatterns)
  231. {
  232. $this->token = Opt_Expression_Standard_Parser::T_CONCAT;
  233. }
  234. function yy_r1_16($yy_subpatterns)
  235. {
  236. $this->token = Opt_Expression_Standard_Parser::T_IS_BETWEEN;
  237. }
  238. function yy_r1_17($yy_subpatterns)
  239. {
  240. $this->token = Opt_Expression_Standard_Parser::T_IS_NOT_BETWEEN;
  241. }
  242. function yy_r1_18($yy_subpatterns)
  243. {
  244. $this->token = Opt_Expression_Standard_Parser::T_IS_EITHER;
  245. }
  246. function yy_r1_19($yy_subpatterns)
  247. {
  248. $this->token = Opt_Expression_Standard_Parser::T_IS_NEITHER;
  249. }
  250. function yy_r1_20($yy_subpatterns)
  251. {
  252. $this->token = Opt_Expression_Standard_Parser::T_CONTAINS_BOTH;
  253. }
  254. function yy_r1_21($yy_subpatterns)
  255. {
  256. $this->token = Opt_Expression_Standard_Parser::T_CONTAINS_EITHER;
  257. }
  258. function yy_r1_22($yy_subpatterns)
  259. {
  260. $this->token = Opt_Expression_Standard_Parser::T_CONTAINS_NEITHER;
  261. }
  262. function yy_r1_23($yy_subpatterns)
  263. {
  264. $this->token = Opt_Expression_Standard_Parser::T_IS_IN;
  265. }
  266. function yy_r1_24($yy_subpatterns)
  267. {
  268. $this->token = Opt_Expression_Standard_Parser::T_IS_NOT_IN;
  269. }
  270. function yy_r1_25($yy_subpatterns)
  271. {
  272. $this->token = Opt_Expression_Standard_Parser::T_IS_BOTH_IN;
  273. }
  274. function yy_r1_26($yy_subpatterns)
  275. {
  276. $this->token = Opt_Expression_Standard_Parser::T_IS_EITHER_IN;
  277. }
  278. function yy_r1_27($yy_subpatterns)
  279. {
  280. $this->token = Opt_Expression_Standard_Parser::T_IS_NEITHER_IN;
  281. }
  282. function yy_r1_28($yy_subpatterns)
  283. {
  284. $this->token = Opt_Expression_Standard_Parser::T_DOLLAR;
  285. }
  286. function yy_r1_29($yy_subpatterns)
  287. {
  288. $this->token = Opt_Expression_Standard_Parser::T_AT;
  289. }
  290. function yy_r1_30($yy_subpatterns)
  291. {
  292. $this->token = Opt_Expression_Standard_Parser::T_DOT;
  293. }
  294. function yy_r1_31($yy_subpatterns)
  295. {
  296. $this->token = Opt_Expression_Standard_Parser::T_ASSIGN;
  297. }
  298. function yy_r1_32($yy_subpatterns)
  299. {
  300. $this->token = Opt_Expression_Standard_Parser::T_L_BRACKET;
  301. }
  302. function yy_r1_33($yy_subpatterns)
  303. {
  304. $this->token = Opt_Expression_Standard_Parser::T_R_BRACKET;
  305. }
  306. function yy_r1_34($yy_subpatterns)
  307. {
  308. $this->token = Opt_Expression_Standard_Parser::T_DLSQ_BRACKET;
  309. }
  310. function yy_r1_35($yy_subpatterns)
  311. {
  312. $this->token = Opt_Expression_Standard_Parser::T_DRSQ_BRACKET;
  313. }
  314. function yy_r1_36($yy_subpatterns)
  315. {
  316. $this->token = Opt_Expression_Standard_Parser::T_LSQ_BRACKET;
  317. }
  318. function yy_r1_37($yy_subpatterns)
  319. {
  320. $this->token = Opt_Expression_Standard_Parser::T_RSQ_BRACKET;
  321. }
  322. function yy_r1_38($yy_subpatterns)
  323. {
  324. $this->token = Opt_Expression_Standard_Parser::T_OBJECT_OPERATOR;
  325. }
  326. function yy_r1_39($yy_subpatterns)
  327. {
  328. $this->token = Opt_Expression_Standard_Parser::T_COMMA;
  329. }
  330. function yy_r1_40($yy_subpatterns)
  331. {
  332. $this->token = Opt_Expression_Standard_Parser::T_COLON;
  333. }
  334. function yy_r1_41($yy_subpatterns)
  335. {
  336. switch($this->value)
  337. {
  338. case 'add':
  339. $this->token = Opt_Expression_Standard_Parser::T_ADD;
  340. break;
  341. case 'sub':
  342. $this->token = Opt_Expression_Standard_Parser::T_SUB;
  343. break;
  344. case 'mul':
  345. $this->token = Opt_Expression_Standard_Parser::T_MUL;
  346. break;
  347. case 'div':
  348. $this->token = Opt_Expression_Standard_Parser::T_DIV;
  349. break;
  350. case 'mod':
  351. $this->token = Opt_Expression_Standard_Parser::T_MOD;
  352. break;
  353. case 'exp':
  354. $this->token = Opt_Expression_Standard_Parser::T_EXP;
  355. break;
  356. case 'and':
  357. $this->token = Opt_Expression_Standard_Parser::T_AND;
  358. break;
  359. case 'or':
  360. $this->token = Opt_Expression_Standard_Parser::T_OR;
  361. break;
  362. case 'nor':
  363. $this->token = Opt_Expression_Standard_Parser::T_NOR;
  364. break;
  365. case 'not':
  366. $this->token = Opt_Expression_Standard_Parser::T_NOT;
  367. break;
  368. case 'xor':
  369. $this->token = Opt_Expression_Standard_Parser::T_XOR;
  370. break;
  371. case 'eq':
  372. $this->token = Opt_Expression_Standard_Parser::T_EQUALS;
  373. break;
  374. case 'neq':
  375. $this->token = Opt_Expression_Standard_Parser::T_NEQUALS;
  376. break;
  377. case 'eqt':
  378. $this->token = Opt_Expression_Standard_Parser::T_EQUALS_T;
  379. break;
  380. case 'neqt':
  381. $this->token = Opt_Expression_Standard_Parser::T_NEQUALS_T;
  382. break;
  383. case 'gt':
  384. $this->token = Opt_Expression_Standard_Parser::T_GT;
  385. break;
  386. case 'lt':
  387. $this->token = Opt_Expression_Standard_Parser::T_LT;
  388. break;
  389. case 'gte':
  390. $this->token = Opt_Expression_Standard_Parser::T_GTE;
  391. break;
  392. case 'lte':
  393. $this->token = Opt_Expression_Standard_Parser::T_LTE;
  394. break;
  395. case 'contains':
  396. $this->token = Opt_Expression_Standard_Parser::T_CONTAINS;
  397. break;
  398. case 'exists':
  399. $this->token = Opt_Expression_Standard_Parser::T_EXISTS;
  400. break;
  401. case 'is':
  402. $this->token = Opt_Expression_Standard_Parser::T_ASSIGN;
  403. break;
  404. case 'true':
  405. $this->token = Opt_Expression_Standard_Parser::T_TRUE;
  406. break;
  407. case 'false':
  408. $this->token = Opt_Expression_Standard_Parser::T_FALSE;
  409. break;
  410. case 'null':
  411. $this->token = Opt_Expression_Standard_Parser::T_NULL;
  412. break;
  413. case 'new':
  414. $this->token = Opt_Expression_Standard_Parser::T_NEW;
  415. break;
  416. case 'clone':
  417. $this->token = Opt_Expression_Standard_Parser::T_CLONE;
  418. break;
  419. default:
  420. $this->token = Opt_Expression_Standard_Parser::T_IDENTIFIER;
  421. }
  422. }
  423. function yy_r1_42($yy_subpatterns)
  424. {
  425. $this->token = Opt_Expression_Standard_Parser::T_STRING;
  426. }
  427. function yy_r1_43($yy_subpatterns)
  428. {
  429. $this->token = Opt_Expression_Standard_Parser::T_BACKTICKS;
  430. }
  431. function yy_r1_44($yy_subpatterns)
  432. {
  433. $this->token = Opt_Expression_Standard_Parser::T_NUMBER;
  434. }
  435. function yy_r1_45($yy_subpatterns)
  436. {
  437. $this->token = Opt_Expression_Standard_Parser::T_NUMBER;
  438. }
  439. } // end Opt_Expression_Standard_Lexer;