1: | <?php
|
2: | |
3: | |
4: | |
5: | |
6: | |
7: | |
8: | |
9: |
|
10: |
|
11: | |
12: | |
13: | |
14: | |
15: | |
16: | |
17: | |
18: |
|
19: | class Smarty_Internal_Templatelexer
|
20: | {
|
21: | const TEXT = 1;
|
22: | const TAG = 2;
|
23: | const TAGBODY = 3;
|
24: | const LITERAL = 4;
|
25: | const DOUBLEQUOTEDSTRING = 5;
|
26: |
|
27: | |
28: | |
29: | |
30: | |
31: |
|
32: | public $data;
|
33: |
|
34: | |
35: | |
36: | |
37: | |
38: |
|
39: | public $dataLength = null;
|
40: |
|
41: | |
42: | |
43: | |
44: | |
45: |
|
46: | public $counter;
|
47: |
|
48: | |
49: | |
50: | |
51: | |
52: |
|
53: | public $token;
|
54: |
|
55: | |
56: | |
57: | |
58: | |
59: |
|
60: | public $value;
|
61: |
|
62: | |
63: | |
64: | |
65: | |
66: |
|
67: | public $line;
|
68: |
|
69: | |
70: | |
71: | |
72: | |
73: |
|
74: | public $taglineno;
|
75: |
|
76: | |
77: | |
78: | |
79: | |
80: |
|
81: | public $phpType = '';
|
82: |
|
83: | |
84: | |
85: | |
86: | |
87: |
|
88: | public $state = 1;
|
89: |
|
90: | |
91: | |
92: | |
93: | |
94: |
|
95: | public $smarty = null;
|
96: |
|
97: | |
98: | |
99: | |
100: | |
101: |
|
102: | public $compiler = null;
|
103: |
|
104: | |
105: | |
106: | |
107: | |
108: |
|
109: | public $yyTraceFILE;
|
110: |
|
111: | |
112: | |
113: | |
114: | |
115: |
|
116: | public $yyTracePrompt;
|
117: |
|
118: | |
119: | |
120: | |
121: | |
122: |
|
123: | public $is_xml = false;
|
124: |
|
125: | |
126: | |
127: | |
128: | |
129: |
|
130: | public $state_name = array(1 => 'TEXT', 2 => 'TAG', 3 => 'TAGBODY', 4 => 'LITERAL', 5 => 'DOUBLEQUOTEDSTRING',);
|
131: |
|
132: | |
133: | |
134: | |
135: | |
136: |
|
137: | public $smarty_token_names = array(
|
138: | 'NOT' => '(!,not)',
|
139: | 'OPENP' => '(',
|
140: | 'CLOSEP' => ')',
|
141: | 'OPENB' => '[',
|
142: | 'CLOSEB' => ']',
|
143: | 'PTR' => '->',
|
144: | 'APTR' => '=>',
|
145: | 'EQUAL' => '=',
|
146: | 'NUMBER' => 'number',
|
147: | 'UNIMATH' => '+" , "-',
|
148: | 'MATH' => '*" , "/" , "%',
|
149: | 'INCDEC' => '++" , "--',
|
150: | 'SPACE' => ' ',
|
151: | 'DOLLAR' => '$',
|
152: | 'SEMICOLON' => ';',
|
153: | 'COLON' => ':',
|
154: | 'DOUBLECOLON' => '::',
|
155: | 'AT' => '@',
|
156: | 'HATCH' => '#',
|
157: | 'QUOTE' => '"',
|
158: | 'BACKTICK' => '`',
|
159: | 'VERT' => '"|" modifier',
|
160: | 'DOT' => '.',
|
161: | 'COMMA' => '","',
|
162: | 'QMARK' => '"?"',
|
163: | 'ID' => 'id, name',
|
164: | 'TEXT' => 'text',
|
165: | 'LDELSLASH' => '{/..} closing tag',
|
166: | 'LDEL' => '{...} Smarty tag',
|
167: | 'COMMENT' => 'comment',
|
168: | 'AS' => 'as',
|
169: | 'TO' => 'to',
|
170: | 'PHP' => '"<?php", "<%", "{php}" tag',
|
171: | 'LOGOP' => '"<", "==" ... logical operator',
|
172: | 'TLOGOP' => '"lt", "eq" ... logical operator; "is div by" ... if condition',
|
173: | 'SCOND' => '"is even" ... if condition',
|
174: | );
|
175: |
|
176: | |
177: | |
178: | |
179: | |
180: |
|
181: | private $literal_cnt = 0;
|
182: |
|
183: | |
184: | |
185: | |
186: | |
187: |
|
188: | private $yy_global_pattern1 = null;
|
189: |
|
190: | |
191: | |
192: | |
193: | |
194: |
|
195: | private $yy_global_pattern2 = null;
|
196: |
|
197: | |
198: | |
199: | |
200: | |
201: |
|
202: | private $yy_global_pattern3 = null;
|
203: |
|
204: | |
205: | |
206: | |
207: | |
208: |
|
209: | private $yy_global_pattern4 = null;
|
210: |
|
211: | |
212: | |
213: | |
214: | |
215: |
|
216: | private $yy_global_pattern5 = null;
|
217: |
|
218: | |
219: | |
220: | |
221: | |
222: |
|
223: | private $yy_global_text = null;
|
224: |
|
225: | |
226: | |
227: | |
228: | |
229: |
|
230: | private $yy_global_literal = null;
|
231: |
|
232: | private $_yy_state = 1;
|
233: |
|
234: | private $_yy_stack = array();
|
235: |
|
236: | |
237: | |
238: | |
239: | |
240: | |
241: |
|
242: | public function __construct($source, Smarty_Internal_TemplateCompilerBase $compiler)
|
243: | {
|
244: | $this->data = $source;
|
245: | $this->dataLength = strlen($this->data);
|
246: | $this->counter = 0;
|
247: | if (preg_match('/^\xEF\xBB\xBF/i', $this->data, $match)) {
|
248: | $this->counter += strlen($match[ 0 ]);
|
249: | }
|
250: | $this->line = 1;
|
251: | $this->smarty = $compiler->template->smarty;
|
252: | $this->compiler = $compiler;
|
253: | $this->compiler->initDelimiterPreg();
|
254: | $this->smarty_token_names[ 'LDEL' ] = $this->smarty->getLeftDelimiter();
|
255: | $this->smarty_token_names[ 'RDEL' ] = $this->smarty->getRightDelimiter();
|
256: | }
|
257: |
|
258: | |
259: | |
260: | |
261: |
|
262: | public function PrintTrace()
|
263: | {
|
264: | $this->yyTraceFILE = fopen('php://output', 'w');
|
265: | $this->yyTracePrompt = '<br>';
|
266: | }
|
267: |
|
268: | |
269: | |
270: | |
271: | |
272: | |
273: | |
274: |
|
275: | public function replace($preg)
|
276: | {
|
277: | return $this->compiler->replaceDelimiter($preg);
|
278: | }
|
279: |
|
280: | |
281: | |
282: | |
283: | |
284: |
|
285: | public function isAutoLiteral()
|
286: | {
|
287: | return $this->smarty->getAutoLiteral() && isset($this->value[ $this->compiler->getLdelLength() ]) ?
|
288: | strpos(" \n\t\r", $this->value[ $this->compiler->getLdelLength() ]) !== false : false;
|
289: | }
|
290: |
|
291: | public function yylex()
|
292: | {
|
293: | return $this->{'yylex' . $this->_yy_state}();
|
294: | }
|
295: |
|
296: | public function yypushstate($state)
|
297: | {
|
298: | if ($this->yyTraceFILE) {
|
299: | fprintf($this->yyTraceFILE, "%sState push %s\n", $this->yyTracePrompt,
|
300: | isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state);
|
301: | }
|
302: | array_push($this->_yy_stack, $this->_yy_state);
|
303: | $this->_yy_state = $state;
|
304: | if ($this->yyTraceFILE) {
|
305: | fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt,
|
306: | isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state);
|
307: | }
|
308: | }
|
309: |
|
310: | public function yypopstate()
|
311: | {
|
312: | if ($this->yyTraceFILE) {
|
313: | fprintf($this->yyTraceFILE, "%sState pop %s\n", $this->yyTracePrompt,
|
314: | isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state);
|
315: | }
|
316: | $this->_yy_state = array_pop($this->_yy_stack);
|
317: | if ($this->yyTraceFILE) {
|
318: | fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt,
|
319: | isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state);
|
320: | }
|
321: | }
|
322: |
|
323: | public function yybegin($state)
|
324: | {
|
325: | $this->_yy_state = $state;
|
326: | if ($this->yyTraceFILE) {
|
327: | fprintf($this->yyTraceFILE, "%sState set %s\n", $this->yyTracePrompt,
|
328: | isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state);
|
329: | }
|
330: | }
|
331: |
|
332: | public function yylex1()
|
333: | {
|
334: | if (!isset($this->yy_global_pattern1)) {
|
335: | $this->yy_global_pattern1 =
|
336: | $this->replace("/\G([{][}])|\G((SMARTYldel)SMARTYal[*])|\G((SMARTYldel)SMARTYalphp([ ].*?)?SMARTYrdel|(SMARTYldel)SMARTYal[\/]phpSMARTYrdel)|\G((SMARTYldel)SMARTYautoliteral\\s+SMARTYliteral)|\G((SMARTYldel)SMARTYalliteral\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/]literal\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal)|\G([<][?]((php\\s+|=)|\\s+)|[<][%]|[<][?]xml\\s+|[<]script\\s+language\\s*=\\s*[\"']?\\s*php\\s*[\"']?\\s*[>]|[?][>]|[%][>])|\G([\S\s])/isS");
|
337: | }
|
338: | if (!isset($this->dataLength)) {
|
339: | $this->dataLength = strlen($this->data);
|
340: | }
|
341: | if ($this->counter >= $this->dataLength) {
|
342: | return false;
|
343: | }
|
344: | do {
|
345: | if (preg_match($this->yy_global_pattern1, $this->data, $yymatches, 0, $this->counter)) {
|
346: | if (!isset($yymatches[ 0 ][ 1 ])) {
|
347: | $yymatches = preg_grep("/(.|\s)+/", $yymatches);
|
348: | } else {
|
349: | $yymatches = array_filter($yymatches);
|
350: | }
|
351: | if (empty($yymatches)) {
|
352: | throw new Exception('Error: lexing failed because a rule matched' .
|
353: | ' an empty string. Input "' . substr($this->data,
|
354: | $this->counter, 5) . '... state TEXT');
|
355: | }
|
356: | next($yymatches);
|
357: | $this->token = key($yymatches);
|
358: | $this->value = current($yymatches);
|
359: | $r = $this->{'yy_r1_' . $this->token}();
|
360: | if ($r === null) {
|
361: | $this->counter += strlen($this->value);
|
362: | $this->line += substr_count($this->value, "\n");
|
363: |
|
364: | return true;
|
365: | } elseif ($r === true) {
|
366: |
|
367: |
|
368: | return $this->yylex();
|
369: | } elseif ($r === false) {
|
370: | $this->counter += strlen($this->value);
|
371: | $this->line += substr_count($this->value, "\n");
|
372: | if ($this->counter >= $this->dataLength) {
|
373: | return false;
|
374: | }
|
375: |
|
376: | continue;
|
377: | }
|
378: | } else {
|
379: | throw new Exception('Unexpected input at line ' . $this->line .
|
380: | ': ' . $this->data[ $this->counter ]);
|
381: | }
|
382: | break;
|
383: | } while (true);
|
384: | }
|
385: |
|
386: | public function yy_r1_1()
|
387: | {
|
388: | $this->token = Smarty_Internal_Templateparser::TP_TEXT;
|
389: | }
|
390: |
|
391: | public function yy_r1_2()
|
392: | {
|
393: | $to = $this->dataLength;
|
394: | preg_match("/[*]{$this->compiler->getRdelPreg()}[\n]?/", $this->data, $match, PREG_OFFSET_CAPTURE,
|
395: | $this->counter);
|
396: | if (isset($match[ 0 ][ 1 ])) {
|
397: | $to = $match[ 0 ][ 1 ] + strlen($match[ 0 ][ 0 ]);
|
398: | } else {
|
399: | $this->compiler->trigger_template_error("missing or misspelled comment closing tag '{$this->smarty->getRightDelimiter()}'");
|
400: | }
|
401: | $this->value = substr($this->data, $this->counter, $to - $this->counter);
|
402: | return false;
|
403: | }
|
404: |
|
405: | public function yy_r1_4()
|
406: | {
|
407: | $this->compiler->getTagCompiler('private_php')->parsePhp($this);
|
408: | }
|
409: |
|
410: | public function yy_r1_8()
|
411: | {
|
412: | $this->token = Smarty_Internal_Templateparser::TP_TEXT;
|
413: | }
|
414: |
|
415: | public function yy_r1_10()
|
416: | {
|
417: | $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART;
|
418: | $this->yypushstate(self::LITERAL);
|
419: | }
|
420: |
|
421: | public function yy_r1_12()
|
422: | {
|
423: | $this->token = Smarty_Internal_Templateparser::TP_LITERALEND;
|
424: | $this->yypushstate(self::LITERAL);
|
425: | }
|
426: |
|
427: | public function yy_r1_14()
|
428: | {
|
429: | $this->yypushstate(self::TAG);
|
430: | return true;
|
431: | }
|
432: |
|
433: | public function yy_r1_16()
|
434: | {
|
435: | $this->compiler->getTagCompiler('private_php')->parsePhp($this);
|
436: | }
|
437: |
|
438: | public function yy_r1_19()
|
439: | {
|
440: | if (!isset($this->yy_global_text)) {
|
441: | $this->yy_global_text =
|
442: | $this->replace('/(SMARTYldel)SMARTYal|[<][?]((php\s+|=)|\s+)|[<][%]|[<][?]xml\s+|[<]script\s+language\s*=\s*["\']?\s*php\s*["\']?\s*[>]|[?][>]|[%][>]SMARTYliteral/isS');
|
443: | }
|
444: | $to = $this->dataLength;
|
445: | preg_match($this->yy_global_text, $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter);
|
446: | if (isset($match[ 0 ][ 1 ])) {
|
447: | $to = $match[ 0 ][ 1 ];
|
448: | }
|
449: | $this->value = substr($this->data, $this->counter, $to - $this->counter);
|
450: | $this->token = Smarty_Internal_Templateparser::TP_TEXT;
|
451: | }
|
452: |
|
453: | public function yylex2()
|
454: | {
|
455: | if (!isset($this->yy_global_pattern2)) {
|
456: | $this->yy_global_pattern2 =
|
457: | $this->replace("/\G((SMARTYldel)SMARTYal(if|elseif|else if|while)\\s+)|\G((SMARTYldel)SMARTYalfor\\s+)|\G((SMARTYldel)SMARTYalforeach(?![^\s]))|\G((SMARTYldel)SMARTYalsetfilter\\s+)|\G((SMARTYldel)SMARTYalmake_nocache\\s+)|\G((SMARTYldel)SMARTYal[0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[$]smarty\\.block\\.(child|parent)\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/][0-9]*[a-zA-Z_]\\w*\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[$][0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/])|\G((SMARTYldel)SMARTYal)/isS");
|
458: | }
|
459: | if (!isset($this->dataLength)) {
|
460: | $this->dataLength = strlen($this->data);
|
461: | }
|
462: | if ($this->counter >= $this->dataLength) {
|
463: | return false;
|
464: | }
|
465: | do {
|
466: | if (preg_match($this->yy_global_pattern2, $this->data, $yymatches, 0, $this->counter)) {
|
467: | if (!isset($yymatches[ 0 ][ 1 ])) {
|
468: | $yymatches = preg_grep("/(.|\s)+/", $yymatches);
|
469: | } else {
|
470: | $yymatches = array_filter($yymatches);
|
471: | }
|
472: | if (empty($yymatches)) {
|
473: | throw new Exception('Error: lexing failed because a rule matched' .
|
474: | ' an empty string. Input "' . substr($this->data,
|
475: | $this->counter, 5) . '... state TAG');
|
476: | }
|
477: | next($yymatches);
|
478: | $this->token = key($yymatches);
|
479: | $this->value = current($yymatches);
|
480: | $r = $this->{'yy_r2_' . $this->token}();
|
481: | if ($r === null) {
|
482: | $this->counter += strlen($this->value);
|
483: | $this->line += substr_count($this->value, "\n");
|
484: |
|
485: | return true;
|
486: | } elseif ($r === true) {
|
487: |
|
488: |
|
489: | return $this->yylex();
|
490: | } elseif ($r === false) {
|
491: | $this->counter += strlen($this->value);
|
492: | $this->line += substr_count($this->value, "\n");
|
493: | if ($this->counter >= $this->dataLength) {
|
494: | return false;
|
495: | }
|
496: |
|
497: | continue;
|
498: | }
|
499: | } else {
|
500: | throw new Exception('Unexpected input at line ' . $this->line .
|
501: | ': ' . $this->data[ $this->counter ]);
|
502: | }
|
503: | break;
|
504: | } while (true);
|
505: | }
|
506: |
|
507: | public function yy_r2_1()
|
508: | {
|
509: | $this->token = Smarty_Internal_Templateparser::TP_LDELIF;
|
510: | $this->yybegin(self::TAGBODY);
|
511: | $this->taglineno = $this->line;
|
512: | }
|
513: |
|
514: | public function yy_r2_4()
|
515: | {
|
516: | $this->token = Smarty_Internal_Templateparser::TP_LDELFOR;
|
517: | $this->yybegin(self::TAGBODY);
|
518: | $this->taglineno = $this->line;
|
519: | }
|
520: |
|
521: | public function yy_r2_6()
|
522: | {
|
523: | $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH;
|
524: | $this->yybegin(self::TAGBODY);
|
525: | $this->taglineno = $this->line;
|
526: | }
|
527: |
|
528: | public function yy_r2_8()
|
529: | {
|
530: | $this->token = Smarty_Internal_Templateparser::TP_LDELSETFILTER;
|
531: | $this->yybegin(self::TAGBODY);
|
532: | $this->taglineno = $this->line;
|
533: | }
|
534: |
|
535: | public function yy_r2_10()
|
536: | {
|
537: | $this->token = Smarty_Internal_Templateparser::TP_LDELMAKENOCACHE;
|
538: | $this->yybegin(self::TAGBODY);
|
539: | $this->taglineno = $this->line;
|
540: | }
|
541: |
|
542: | public function yy_r2_12()
|
543: | {
|
544: | $this->yypopstate();
|
545: | $this->token = Smarty_Internal_Templateparser::TP_SIMPLETAG;
|
546: | $this->taglineno = $this->line;
|
547: | }
|
548: |
|
549: | public function yy_r2_15()
|
550: | {
|
551: | $this->yypopstate();
|
552: | $this->token = Smarty_Internal_Templateparser::TP_SMARTYBLOCKCHILDPARENT;
|
553: | $this->taglineno = $this->line;
|
554: | }
|
555: |
|
556: | public function yy_r2_18()
|
557: | {
|
558: | $this->yypopstate();
|
559: | $this->token = Smarty_Internal_Templateparser::TP_CLOSETAG;
|
560: | $this->taglineno = $this->line;
|
561: | }
|
562: |
|
563: | public function yy_r2_20()
|
564: | {
|
565: | if ($this->_yy_stack[ count($this->_yy_stack) - 1 ] === self::TEXT) {
|
566: | $this->yypopstate();
|
567: | $this->token = Smarty_Internal_Templateparser::TP_SIMPELOUTPUT;
|
568: | $this->taglineno = $this->line;
|
569: | } else {
|
570: | $this->value = $this->smarty->getLeftDelimiter();
|
571: | $this->token = Smarty_Internal_Templateparser::TP_LDEL;
|
572: | $this->yybegin(self::TAGBODY);
|
573: | $this->taglineno = $this->line;
|
574: | }
|
575: | }
|
576: |
|
577: | public function yy_r2_23()
|
578: | {
|
579: | $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
|
580: | $this->yybegin(self::TAGBODY);
|
581: | $this->taglineno = $this->line;
|
582: | }
|
583: |
|
584: | public function yy_r2_25()
|
585: | {
|
586: | $this->token = Smarty_Internal_Templateparser::TP_LDEL;
|
587: | $this->yybegin(self::TAGBODY);
|
588: | $this->taglineno = $this->line;
|
589: | }
|
590: |
|
591: | public function yylex3()
|
592: | {
|
593: | if (!isset($this->yy_global_pattern3)) {
|
594: | $this->yy_global_pattern3 =
|
595: | $this->replace("/\G(\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal)|\G([\"])|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(\\s+is\\s+in\\s+)|\G(\\s+as\\s+)|\G(\\s+to\\s+)|\G(\\s+step\\s+)|\G(\\s+instanceof\\s+)|\G(\\s*([!=][=]{1,2}|[<][=>]?|[>][=]?|[&|]{2})\\s*)|\G(\\s+(eq|ne|neq|gt|ge|gte|lt|le|lte|mod|and|or|xor)\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even|div)\\s+by\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even))|\G([!]\\s*|not\\s+)|\G([(](int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)[)]\\s*)|\G(\\s*[(]\\s*)|\G(\\s*[)])|\G(\\[\\s*)|\G(\\s*\\])|\G(\\s*[-][>]\\s*)|\G(\\s*[=][>]\\s*)|\G(\\s*[=]\\s*)|\G(([+]|[-]){2})|\G(\\s*([+]|[-])\\s*)|\G(\\s*([*]{1,2}|[%\/^&]|[<>]{2})\\s*)|\G([@])|\G(array\\s*[(]\\s*)|\G([#])|\G(\\s+[0-9]*[a-zA-Z_][a-zA-Z0-9_\-:]*\\s*[=]\\s*)|\G(([0-9]*[a-zA-Z_]\\w*)?(\\\\[0-9]*[a-zA-Z_]\\w*)+)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G([`])|\G([|][@]?)|\G([.])|\G(\\s*[,]\\s*)|\G(\\s*[;]\\s*)|\G([:]{2})|\G(\\s*[:]\\s*)|\G(\\s*[?]\\s*)|\G(0[xX][0-9a-fA-F]+)|\G(\\s+)|\G([\S\s])/isS");
|
596: | }
|
597: | if (!isset($this->dataLength)) {
|
598: | $this->dataLength = strlen($this->data);
|
599: | }
|
600: | if ($this->counter >= $this->dataLength) {
|
601: | return false;
|
602: | }
|
603: | do {
|
604: | if (preg_match($this->yy_global_pattern3, $this->data, $yymatches, 0, $this->counter)) {
|
605: | if (!isset($yymatches[ 0 ][ 1 ])) {
|
606: | $yymatches = preg_grep("/(.|\s)+/", $yymatches);
|
607: | } else {
|
608: | $yymatches = array_filter($yymatches);
|
609: | }
|
610: | if (empty($yymatches)) {
|
611: | throw new Exception('Error: lexing failed because a rule matched' .
|
612: | ' an empty string. Input "' . substr($this->data,
|
613: | $this->counter, 5) . '... state TAGBODY');
|
614: | }
|
615: | next($yymatches);
|
616: | $this->token = key($yymatches);
|
617: | $this->value = current($yymatches);
|
618: | $r = $this->{'yy_r3_' . $this->token}();
|
619: | if ($r === null) {
|
620: | $this->counter += strlen($this->value);
|
621: | $this->line += substr_count($this->value, "\n");
|
622: |
|
623: | return true;
|
624: | } elseif ($r === true) {
|
625: |
|
626: |
|
627: | return $this->yylex();
|
628: | } elseif ($r === false) {
|
629: | $this->counter += strlen($this->value);
|
630: | $this->line += substr_count($this->value, "\n");
|
631: | if ($this->counter >= $this->dataLength) {
|
632: | return false;
|
633: | }
|
634: |
|
635: | continue;
|
636: | }
|
637: | } else {
|
638: | throw new Exception('Unexpected input at line ' . $this->line .
|
639: | ': ' . $this->data[ $this->counter ]);
|
640: | }
|
641: | break;
|
642: | } while (true);
|
643: | }
|
644: |
|
645: | public function yy_r3_1()
|
646: | {
|
647: | $this->token = Smarty_Internal_Templateparser::TP_RDEL;
|
648: | $this->yypopstate();
|
649: | }
|
650: |
|
651: | public function yy_r3_2()
|
652: | {
|
653: | $this->yypushstate(self::TAG);
|
654: | return true;
|
655: | }
|
656: |
|
657: | public function yy_r3_4()
|
658: | {
|
659: | $this->token = Smarty_Internal_Templateparser::TP_QUOTE;
|
660: | $this->yypushstate(self::DOUBLEQUOTEDSTRING);
|
661: | $this->compiler->enterDoubleQuote();
|
662: | }
|
663: |
|
664: | public function yy_r3_5()
|
665: | {
|
666: | $this->token = Smarty_Internal_Templateparser::TP_SINGLEQUOTESTRING;
|
667: | }
|
668: |
|
669: | public function yy_r3_6()
|
670: | {
|
671: | $this->token = Smarty_Internal_Templateparser::TP_DOLLARID;
|
672: | }
|
673: |
|
674: | public function yy_r3_7()
|
675: | {
|
676: | $this->token = Smarty_Internal_Templateparser::TP_DOLLAR;
|
677: | }
|
678: |
|
679: | public function yy_r3_8()
|
680: | {
|
681: | $this->token = Smarty_Internal_Templateparser::TP_ISIN;
|
682: | }
|
683: |
|
684: | public function yy_r3_9()
|
685: | {
|
686: | $this->token = Smarty_Internal_Templateparser::TP_AS;
|
687: | }
|
688: |
|
689: | public function yy_r3_10()
|
690: | {
|
691: | $this->token = Smarty_Internal_Templateparser::TP_TO;
|
692: | }
|
693: |
|
694: | public function yy_r3_11()
|
695: | {
|
696: | $this->token = Smarty_Internal_Templateparser::TP_STEP;
|
697: | }
|
698: |
|
699: | public function yy_r3_12()
|
700: | {
|
701: | $this->token = Smarty_Internal_Templateparser::TP_INSTANCEOF;
|
702: | }
|
703: |
|
704: | public function yy_r3_13()
|
705: | {
|
706: | $this->token = Smarty_Internal_Templateparser::TP_LOGOP;
|
707: | }
|
708: |
|
709: | public function yy_r3_15()
|
710: | {
|
711: | $this->token = Smarty_Internal_Templateparser::TP_SLOGOP;
|
712: | }
|
713: |
|
714: | public function yy_r3_17()
|
715: | {
|
716: | $this->token = Smarty_Internal_Templateparser::TP_TLOGOP;
|
717: | }
|
718: |
|
719: | public function yy_r3_20()
|
720: | {
|
721: | $this->token = Smarty_Internal_Templateparser::TP_SINGLECOND;
|
722: | }
|
723: |
|
724: | public function yy_r3_23()
|
725: | {
|
726: | $this->token = Smarty_Internal_Templateparser::TP_NOT;
|
727: | }
|
728: |
|
729: | public function yy_r3_24()
|
730: | {
|
731: | $this->token = Smarty_Internal_Templateparser::TP_TYPECAST;
|
732: | }
|
733: |
|
734: | public function yy_r3_28()
|
735: | {
|
736: | $this->token = Smarty_Internal_Templateparser::TP_OPENP;
|
737: | }
|
738: |
|
739: | public function yy_r3_29()
|
740: | {
|
741: | $this->token = Smarty_Internal_Templateparser::TP_CLOSEP;
|
742: | }
|
743: |
|
744: | public function yy_r3_30()
|
745: | {
|
746: | $this->token = Smarty_Internal_Templateparser::TP_OPENB;
|
747: | }
|
748: |
|
749: | public function yy_r3_31()
|
750: | {
|
751: | $this->token = Smarty_Internal_Templateparser::TP_CLOSEB;
|
752: | }
|
753: |
|
754: | public function yy_r3_32()
|
755: | {
|
756: | $this->token = Smarty_Internal_Templateparser::TP_PTR;
|
757: | }
|
758: |
|
759: | public function yy_r3_33()
|
760: | {
|
761: | $this->token = Smarty_Internal_Templateparser::TP_APTR;
|
762: | }
|
763: |
|
764: | public function yy_r3_34()
|
765: | {
|
766: | $this->token = Smarty_Internal_Templateparser::TP_EQUAL;
|
767: | }
|
768: |
|
769: | public function yy_r3_35()
|
770: | {
|
771: | $this->token = Smarty_Internal_Templateparser::TP_INCDEC;
|
772: | }
|
773: |
|
774: | public function yy_r3_37()
|
775: | {
|
776: | $this->token = Smarty_Internal_Templateparser::TP_UNIMATH;
|
777: | }
|
778: |
|
779: | public function yy_r3_39()
|
780: | {
|
781: | $this->token = Smarty_Internal_Templateparser::TP_MATH;
|
782: | }
|
783: |
|
784: | public function yy_r3_41()
|
785: | {
|
786: | $this->token = Smarty_Internal_Templateparser::TP_AT;
|
787: | }
|
788: |
|
789: | public function yy_r3_42()
|
790: | {
|
791: | $this->token = Smarty_Internal_Templateparser::TP_ARRAYOPEN;
|
792: | }
|
793: |
|
794: | public function yy_r3_43()
|
795: | {
|
796: | $this->token = Smarty_Internal_Templateparser::TP_HATCH;
|
797: | }
|
798: |
|
799: | public function yy_r3_44()
|
800: | {
|
801: |
|
802: | if (substr($this->data, $this->counter + strlen($this->value) - 1, $this->compiler->getRdelLength()) ===
|
803: | $this->smarty->getRightDelimiter()) {
|
804: | preg_match('/\s+/', $this->value, $match);
|
805: | $this->value = $match[ 0 ];
|
806: | $this->token = Smarty_Internal_Templateparser::TP_SPACE;
|
807: | } else {
|
808: | $this->token = Smarty_Internal_Templateparser::TP_ATTR;
|
809: | }
|
810: | }
|
811: |
|
812: | public function yy_r3_45()
|
813: | {
|
814: | $this->token = Smarty_Internal_Templateparser::TP_NAMESPACE;
|
815: | }
|
816: |
|
817: | public function yy_r3_48()
|
818: | {
|
819: | $this->token = Smarty_Internal_Templateparser::TP_ID;
|
820: | }
|
821: |
|
822: | public function yy_r3_49()
|
823: | {
|
824: | $this->token = Smarty_Internal_Templateparser::TP_INTEGER;
|
825: | }
|
826: |
|
827: | public function yy_r3_50()
|
828: | {
|
829: | $this->token = Smarty_Internal_Templateparser::TP_BACKTICK;
|
830: | $this->yypopstate();
|
831: | }
|
832: |
|
833: | public function yy_r3_51()
|
834: | {
|
835: | $this->token = Smarty_Internal_Templateparser::TP_VERT;
|
836: | }
|
837: |
|
838: | public function yy_r3_52()
|
839: | {
|
840: | $this->token = Smarty_Internal_Templateparser::TP_DOT;
|
841: | }
|
842: |
|
843: | public function yy_r3_53()
|
844: | {
|
845: | $this->token = Smarty_Internal_Templateparser::TP_COMMA;
|
846: | }
|
847: |
|
848: | public function yy_r3_54()
|
849: | {
|
850: | $this->token = Smarty_Internal_Templateparser::TP_SEMICOLON;
|
851: | }
|
852: |
|
853: | public function yy_r3_55()
|
854: | {
|
855: | $this->token = Smarty_Internal_Templateparser::TP_DOUBLECOLON;
|
856: | }
|
857: |
|
858: | public function yy_r3_56()
|
859: | {
|
860: | $this->token = Smarty_Internal_Templateparser::TP_COLON;
|
861: | }
|
862: |
|
863: | public function yy_r3_57()
|
864: | {
|
865: | $this->token = Smarty_Internal_Templateparser::TP_QMARK;
|
866: | }
|
867: |
|
868: | public function yy_r3_58()
|
869: | {
|
870: | $this->token = Smarty_Internal_Templateparser::TP_HEX;
|
871: | }
|
872: |
|
873: | public function yy_r3_59()
|
874: | {
|
875: | $this->token = Smarty_Internal_Templateparser::TP_SPACE;
|
876: | }
|
877: |
|
878: | public function yy_r3_60()
|
879: | {
|
880: | $this->token = Smarty_Internal_Templateparser::TP_TEXT;
|
881: | }
|
882: |
|
883: | public function yylex4()
|
884: | {
|
885: | if (!isset($this->yy_global_pattern4)) {
|
886: | $this->yy_global_pattern4 =
|
887: | $this->replace("/\G((SMARTYldel)SMARTYalliteral\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/]literal\\s*SMARTYrdel)|\G([\S\s])/isS");
|
888: | }
|
889: | if (!isset($this->dataLength)) {
|
890: | $this->dataLength = strlen($this->data);
|
891: | }
|
892: | if ($this->counter >= $this->dataLength) {
|
893: | return false;
|
894: | }
|
895: | do {
|
896: | if (preg_match($this->yy_global_pattern4, $this->data, $yymatches, 0, $this->counter)) {
|
897: | if (!isset($yymatches[ 0 ][ 1 ])) {
|
898: | $yymatches = preg_grep("/(.|\s)+/", $yymatches);
|
899: | } else {
|
900: | $yymatches = array_filter($yymatches);
|
901: | }
|
902: | if (empty($yymatches)) {
|
903: | throw new Exception('Error: lexing failed because a rule matched' .
|
904: | ' an empty string. Input "' . substr($this->data,
|
905: | $this->counter, 5) . '... state LITERAL');
|
906: | }
|
907: | next($yymatches);
|
908: | $this->token = key($yymatches);
|
909: | $this->value = current($yymatches);
|
910: | $r = $this->{'yy_r4_' . $this->token}();
|
911: | if ($r === null) {
|
912: | $this->counter += strlen($this->value);
|
913: | $this->line += substr_count($this->value, "\n");
|
914: |
|
915: | return true;
|
916: | } elseif ($r === true) {
|
917: |
|
918: |
|
919: | return $this->yylex();
|
920: | } elseif ($r === false) {
|
921: | $this->counter += strlen($this->value);
|
922: | $this->line += substr_count($this->value, "\n");
|
923: | if ($this->counter >= $this->dataLength) {
|
924: | return false;
|
925: | }
|
926: |
|
927: | continue;
|
928: | }
|
929: | } else {
|
930: | throw new Exception('Unexpected input at line ' . $this->line .
|
931: | ': ' . $this->data[ $this->counter ]);
|
932: | }
|
933: | break;
|
934: | } while (true);
|
935: | }
|
936: |
|
937: | public function yy_r4_1()
|
938: | {
|
939: | $this->literal_cnt++;
|
940: | $this->token = Smarty_Internal_Templateparser::TP_LITERAL;
|
941: | }
|
942: |
|
943: | public function yy_r4_3()
|
944: | {
|
945: | if ($this->literal_cnt) {
|
946: | $this->literal_cnt--;
|
947: | $this->token = Smarty_Internal_Templateparser::TP_LITERAL;
|
948: | } else {
|
949: | $this->token = Smarty_Internal_Templateparser::TP_LITERALEND;
|
950: | $this->yypopstate();
|
951: | }
|
952: | }
|
953: |
|
954: | public function yy_r4_5()
|
955: | {
|
956: | if (!isset($this->yy_global_literal)) {
|
957: | $this->yy_global_literal = $this->replace('/(SMARTYldel)SMARTYal[\/]?literalSMARTYrdel/isS');
|
958: | }
|
959: | $to = $this->dataLength;
|
960: | preg_match($this->yy_global_literal, $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter);
|
961: | if (isset($match[ 0 ][ 1 ])) {
|
962: | $to = $match[ 0 ][ 1 ];
|
963: | } else {
|
964: | $this->compiler->trigger_template_error("missing or misspelled literal closing tag");
|
965: | }
|
966: | $this->value = substr($this->data, $this->counter, $to - $this->counter);
|
967: | $this->token = Smarty_Internal_Templateparser::TP_LITERAL;
|
968: | }
|
969: |
|
970: | public function yylex5()
|
971: | {
|
972: | if (!isset($this->yy_global_pattern5)) {
|
973: | $this->yy_global_pattern5 =
|
974: | $this->replace("/\G((SMARTYldel)SMARTYautoliteral\\s+SMARTYliteral)|\G((SMARTYldel)SMARTYalliteral\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/]literal\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/])|\G((SMARTYldel)SMARTYal[0-9]*[a-zA-Z_]\\w*)|\G((SMARTYldel)SMARTYal)|\G([\"])|\G([`][$])|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(([^\"\\\\]*?)((?:\\\\.[^\"\\\\]*?)*?)(?=((SMARTYldel)SMARTYal|\\$|`\\$|\"SMARTYliteral)))|\G([\S\s])/isS");
|
975: | }
|
976: | if (!isset($this->dataLength)) {
|
977: | $this->dataLength = strlen($this->data);
|
978: | }
|
979: | if ($this->counter >= $this->dataLength) {
|
980: | return false;
|
981: | }
|
982: | do {
|
983: | if (preg_match($this->yy_global_pattern5, $this->data, $yymatches, 0, $this->counter)) {
|
984: | if (!isset($yymatches[ 0 ][ 1 ])) {
|
985: | $yymatches = preg_grep("/(.|\s)+/", $yymatches);
|
986: | } else {
|
987: | $yymatches = array_filter($yymatches);
|
988: | }
|
989: | if (empty($yymatches)) {
|
990: | throw new Exception('Error: lexing failed because a rule matched' .
|
991: | ' an empty string. Input "' . substr($this->data,
|
992: | $this->counter, 5) . '... state DOUBLEQUOTEDSTRING');
|
993: | }
|
994: | next($yymatches);
|
995: | $this->token = key($yymatches);
|
996: | $this->value = current($yymatches);
|
997: | $r = $this->{'yy_r5_' . $this->token}();
|
998: | if ($r === null) {
|
999: | $this->counter += strlen($this->value);
|
1000: | $this->line += substr_count($this->value, "\n");
|
1001: |
|
1002: | return true;
|
1003: | } elseif ($r === true) {
|
1004: |
|
1005: |
|
1006: | return $this->yylex();
|
1007: | } elseif ($r === false) {
|
1008: | $this->counter += strlen($this->value);
|
1009: | $this->line += substr_count($this->value, "\n");
|
1010: | if ($this->counter >= $this->dataLength) {
|
1011: | return false;
|
1012: | }
|
1013: |
|
1014: | continue;
|
1015: | }
|
1016: | } else {
|
1017: | throw new Exception('Unexpected input at line ' . $this->line .
|
1018: | ': ' . $this->data[ $this->counter ]);
|
1019: | }
|
1020: | break;
|
1021: | } while (true);
|
1022: | }
|
1023: |
|
1024: | public function yy_r5_1()
|
1025: | {
|
1026: | $this->token = Smarty_Internal_Templateparser::TP_TEXT;
|
1027: | }
|
1028: |
|
1029: | public function yy_r5_3()
|
1030: | {
|
1031: | $this->token = Smarty_Internal_Templateparser::TP_TEXT;
|
1032: | }
|
1033: |
|
1034: | public function yy_r5_5()
|
1035: | {
|
1036: | $this->token = Smarty_Internal_Templateparser::TP_TEXT;
|
1037: | }
|
1038: |
|
1039: | public function yy_r5_7()
|
1040: | {
|
1041: | $this->yypushstate(self::TAG);
|
1042: | return true;
|
1043: | }
|
1044: |
|
1045: | public function yy_r5_9()
|
1046: | {
|
1047: | $this->yypushstate(self::TAG);
|
1048: | return true;
|
1049: | }
|
1050: |
|
1051: | public function yy_r5_11()
|
1052: | {
|
1053: | $this->token = Smarty_Internal_Templateparser::TP_LDEL;
|
1054: | $this->taglineno = $this->line;
|
1055: | $this->yypushstate(self::TAGBODY);
|
1056: | }
|
1057: |
|
1058: | public function yy_r5_13()
|
1059: | {
|
1060: | $this->token = Smarty_Internal_Templateparser::TP_QUOTE;
|
1061: | $this->yypopstate();
|
1062: | }
|
1063: |
|
1064: | public function yy_r5_14()
|
1065: | {
|
1066: | $this->token = Smarty_Internal_Templateparser::TP_BACKTICK;
|
1067: | $this->value = substr($this->value, 0, -1);
|
1068: | $this->yypushstate(self::TAGBODY);
|
1069: | $this->taglineno = $this->line;
|
1070: | }
|
1071: |
|
1072: | public function yy_r5_15()
|
1073: | {
|
1074: | $this->token = Smarty_Internal_Templateparser::TP_DOLLARID;
|
1075: | }
|
1076: |
|
1077: | public function yy_r5_16()
|
1078: | {
|
1079: | $this->token = Smarty_Internal_Templateparser::TP_TEXT;
|
1080: | }
|
1081: |
|
1082: | public function yy_r5_17()
|
1083: | {
|
1084: | $this->token = Smarty_Internal_Templateparser::TP_TEXT;
|
1085: | }
|
1086: |
|
1087: | public function yy_r5_22()
|
1088: | {
|
1089: | $to = $this->dataLength;
|
1090: | $this->value = substr($this->data, $this->counter, $to - $this->counter);
|
1091: | $this->token = Smarty_Internal_Templateparser::TP_TEXT;
|
1092: | }
|
1093: | }
|
1094: |
|
1095: |
|
1096: | |