Completed
Branch master (e379bd)
by Pierre-Henry
33:06
created

Smarty_Internal_Templatelexer::yy_r2_10()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 14
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 10
nc 2
nop 0
dl 0
loc 14
rs 9.4285
c 0
b 0
f 0
1
<?php
2
/*
3
 * This file is part of Smarty.
4
 *
5
 * (c) 2015 Uwe Tews
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
11
/**
12
 * Smarty_Internal_Templatelexer
13
 * This is the template file lexer.
14
 * It is generated from the smarty_internal_templatelexer.plex file
15
 *
16
 *
17
 * @author Uwe Tews <[email protected]>
18
 */
19
class Smarty_Internal_Templatelexer
20
{
21
    /**
22
     * Source
23
     *
24
     * @var string
25
     */
26
    public $data;
27
28
    /**
29
     * Source length
30
     *
31
     * @var int
32
     */
33
    public $dataLength = null;
34
35
    /**
36
     * byte counter
37
     *
38
     * @var int
39
     */
40
    public $counter;
41
42
    /**
43
     * token number
44
     *
45
     * @var int
46
     */
47
    public $token;
48
49
    /**
50
     * token value
51
     *
52
     * @var string
53
     */
54
    public $value;
55
56
    /**
57
     * current line
58
     *
59
     * @var int
60
     */
61
    public $line;
62
63
    /**
64
     * tag start line
65
     *
66
     * @var
67
     */
68
    public $taglineno;
69
70
    /**
71
     * php code type
72
     *
73
     * @var string
74
     */
75
    public $phpType = '';
76
77
    /**
78
     * escaped left delimiter
79
     *
80
     * @var string
81
     */
82
    public $ldel = '';
83
84
    /**
85
     * escaped left delimiter length
86
     *
87
     * @var int
88
     */
89
    public $ldel_length = 0;
90
91
    /**
92
     * escaped right delimiter
93
     *
94
     * @var string
95
     */
96
    public $rdel = '';
97
98
    /**
99
     * escaped right delimiter length
100
     *
101
     * @var int
102
     */
103
    public $rdel_length = 0;
104
105
    /**
106
     * state number
107
     *
108
     * @var int
109
     */
110
    public $state = 1;
111
112
    /**
113
     * Smarty object
114
     *
115
     * @var Smarty
116
     */
117
    public $smarty = null;
118
119
    /**
120
     * compiler object
121
     *
122
     * @var Smarty_Internal_TemplateCompilerBase
123
     */
124
    public $compiler = null;
125
126
    /**
127
     * literal tag nesting level
128
     *
129
     * @var int
130
     */
131
    private $literal_cnt = 0;
132
133
    /**
134
     * PHP start tag string
135
     *
136
     * @var string
137
     */
138
139
    /**
140
     * trace file
141
     *
142
     * @var resource
143
     */
144
    public $yyTraceFILE;
145
146
    /**
147
     * trace prompt
148
     *
149
     * @var string
150
     */
151
    public $yyTracePrompt;
152
153
    /**
154
     * XML flag true while processing xml
155
     *
156
     * @var bool
157
     */
158
    public $is_xml = false;
159
160
    /**
161
     * state names
162
     *
163
     * @var array
164
     */
165
    public $state_name = array(1 => 'TEXT', 2 => 'TAG', 3 => 'TAGBODY', 4 => 'LITERAL', 5 => 'DOUBLEQUOTEDSTRING',);
166
167
    /**
168
     * storage for assembled token patterns
169
     *
170
     * @var string
171
     */
172
    private $yy_global_pattern1 = null;
173
174
    private $yy_global_pattern2 = null;
175
176
    private $yy_global_pattern3 = null;
177
178
    private $yy_global_pattern4 = null;
179
180
    private $yy_global_pattern5 = null;
181
182
    /**
183
     * token names
184
     *
185
     * @var array
186
     */
187
    public $smarty_token_names = array(        // Text for parser error messages
188
                                               'NOT' => '(!,not)', 'OPENP' => '(', 'CLOSEP' => ')', 'OPENB' => '[',
189
                                               'CLOSEB' => ']', 'PTR' => '->', 'APTR' => '=>', 'EQUAL' => '=',
190
                                               'NUMBER' => 'number', 'UNIMATH' => '+" , "-', 'MATH' => '*" , "/" , "%',
191
                                               'INCDEC' => '++" , "--', 'SPACE' => ' ', 'DOLLAR' => '$',
192
                                               'SEMICOLON' => ';', 'COLON' => ':', 'DOUBLECOLON' => '::', 'AT' => '@',
193
                                               'HATCH' => '#', 'QUOTE' => '"', 'BACKTICK' => '`',
194
                                               'VERT' => '"|" modifier', 'DOT' => '.', 'COMMA' => '","',
195
                                               'QMARK' => '"?"', 'ID' => 'id, name', 'TEXT' => 'text',
196
                                               'LDELSLASH' => '{/..} closing tag', 'LDEL' => '{...} Smarty tag',
197
                                               'COMMENT' => 'comment', 'AS' => 'as', 'TO' => 'to',
198
                                               'PHP' => '"<?php", "<%", "{php}" tag',
199
                                               'LOGOP' => '"<", "==" ... logical operator',
200
                                               'TLOGOP' => '"lt", "eq" ... logical operator; "is div by" ... if condition',
201
                                               'SCOND' => '"is even" ... if condition',);
202
203
    /**
204
     * constructor
205
     *
206
     * @param   string                             $data template source
207
     * @param Smarty_Internal_TemplateCompilerBase $compiler
208
     */
209
    function __construct($data, Smarty_Internal_TemplateCompilerBase $compiler)
210
    {
211
        $this->data = $data;
212
        $this->dataLength = strlen($data);
213
        $this->counter = 0;
214
        if (preg_match('/^\xEF\xBB\xBF/i', $this->data, $match)) {
215
            $this->counter += strlen($match[ 0 ]);
216
        }
217
        $this->line = 1;
218
        $this->smarty = $compiler->smarty;
219
        $this->compiler = $compiler;
220
        $this->ldel = preg_quote($this->smarty->left_delimiter, '/');
221
        $this->ldel_length = strlen($this->smarty->left_delimiter);
222
        $this->rdel = preg_quote($this->smarty->right_delimiter, '/');
223
        $this->rdel_length = strlen($this->smarty->right_delimiter);
224
        $this->smarty_token_names[ 'LDEL' ] = $this->smarty->left_delimiter;
225
        $this->smarty_token_names[ 'RDEL' ] = $this->smarty->right_delimiter;
226
    }
227
228
    public function PrintTrace()
229
    {
230
        $this->yyTraceFILE = fopen('php://output', 'w');
231
        $this->yyTracePrompt = '<br>';
232
    }
233
234
    /*
235
     * Check if this tag is autoliteral
236
     */
237
    public function isAutoLiteral()
238
    {
239
        return $this->smarty->auto_literal && isset($this->value[ $this->ldel_length ]) ?
240
            strpos(" \n\t\r", $this->value[ $this->ldel_length ]) !== false : false;
241
    }
242
243
    private $_yy_state = 1;
244
245
    private $_yy_stack = array();
246
247
    public function yylex()
248
    {
249
        return $this->{'yylex' . $this->_yy_state}();
250
    }
251
252
    public function yypushstate($state)
253
    {
254
        if ($this->yyTraceFILE) {
255
            fprintf($this->yyTraceFILE, "%sState push %s\n", $this->yyTracePrompt,
256
                    isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] :
257
                        $this->_yy_state);
258
        }
259
        array_push($this->_yy_stack, $this->_yy_state);
260
        $this->_yy_state = $state;
261
        if ($this->yyTraceFILE) {
262
            fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt,
263
                    isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] :
264
                        $this->_yy_state);
265
        }
266
    }
267
268
    public function yypopstate()
269
    {
270
        if ($this->yyTraceFILE) {
271
            fprintf($this->yyTraceFILE, "%sState pop %s\n", $this->yyTracePrompt,
272
                    isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] :
273
                        $this->_yy_state);
274
        }
275
        $this->_yy_state = array_pop($this->_yy_stack);
276
        if ($this->yyTraceFILE) {
277
            fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt,
278
                    isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] :
279
                        $this->_yy_state);
280
        }
281
    }
282
283
    public function yybegin($state)
284
    {
285
        $this->_yy_state = $state;
286
        if ($this->yyTraceFILE) {
287
            fprintf($this->yyTraceFILE, "%sState set %s\n", $this->yyTracePrompt,
288
                    isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] :
289
                        $this->_yy_state);
290
        }
291
    }
292
293
    public function yylex1()
294
    {
295
        if (!isset($this->yy_global_pattern1)) {
296
            $this->yy_global_pattern1 =
297
                "/\G([{][}])|\G(" . $this->ldel . "[*])|\G((" . $this->ldel . "\\s*php([ ].*?)?" . $this->rdel . ")|(" .
298
                $this->ldel . "\\s*[\/]php" . $this->rdel . "))|\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel .
299
                ")|\G(" . $this->ldel . "\\s*)|\G(\\s*" . $this->rdel .
300
                ")|\G((<[?]((php\\s+|=)|\\s+))|(<[%])|(<[?]xml\\s+)|(<script\\s+language\\s*=\\s*[\"']?\\s*php\\s*[\"']?\\s*>)|([?][>])|([%][>]))|\G([\S\s])/isS";
301
        }
302
        if (!isset($this->dataLength)) {
303
            $this->dataLength = strlen($this->data);
304
        }
305
        if ($this->counter >= $this->dataLength) {
306
            return false; // end of input
307
        }
308
309
        do {
310
            if (preg_match($this->yy_global_pattern1, $this->data, $yymatches, null, $this->counter)) {
311
                if (!isset($yymatches[ 0 ][ 1 ])) {
312
                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
313
                } else {
314
                    $yymatches = array_filter($yymatches);
315
                }
316
                if (empty($yymatches)) {
317
                    throw new Exception('Error: lexing failed because a rule matched' . ' an empty string.  Input "' .
318
                                        substr($this->data, $this->counter, 5) . '... state TEXT');
319
                }
320
                next($yymatches); // skip global match
321
                $this->token = key($yymatches); // token number
322
                $this->value = current($yymatches); // token value
323
                $r = $this->{'yy_r1_' . $this->token}();
324
                if ($r === null) {
325
                    $this->counter += strlen($this->value);
326
                    $this->line += substr_count($this->value, "\n");
327
                    // accept this token
328
                    return true;
329
                } elseif ($r === true) {
330
                    // we have changed state
331
                    // process this token in the new state
332
                    return $this->yylex();
333
                } elseif ($r === false) {
334
                    $this->counter += strlen($this->value);
335
                    $this->line += substr_count($this->value, "\n");
336
                    if ($this->counter >= $this->dataLength) {
337
                        return false; // end of input
338
                    }
339
                    // skip this token
340
                    continue;
341
                }
342
            } else {
343
                throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]);
344
            }
345
            break;
346
        }
347
        while (true);
348
    } // end function
349
350
    const TEXT = 1;
351
352
    function yy_r1_1()
353
    {
354
355
        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
356
    }
357
358
    function yy_r1_2()
359
    {
360
361
        preg_match("/[*]{$this->rdel}/", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter);
362
        if (isset($match[ 0 ][ 1 ])) {
363
            $to = $match[ 0 ][ 1 ] + strlen($match[ 0 ][ 0 ]);
364
        } else {
365
            $this->compiler->trigger_template_error("missing or misspelled comment closing tag '*{$this->smarty->right_delimiter}'");
366
        }
367
        $this->value = substr($this->data, $this->counter, $to - $this->counter);
0 ignored issues
show
Bug introduced by
The variable $to does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
368
        return false;
369
    }
370
371
    function yy_r1_3()
372
    {
373
374
        $this->compiler->getTagCompiler('private_php')->parsePhp($this);
0 ignored issues
show
Bug introduced by
It seems like you code against a specific sub-type and not the parent class Smarty_Internal_CompileBase as the method parsePhp() does only exist in the following sub-classes of Smarty_Internal_CompileBase: Smarty_Internal_Compile_Private_Php. Maybe you want to instanceof check for one of these explicitly?

Let’s take a look at an example:

abstract class User
{
    /** @return string */
    abstract public function getPassword();
}

class MyUser extends User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different sub-classes of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the parent class:

    abstract class User
    {
        /** @return string */
        abstract public function getPassword();
    
        /** @return string */
        abstract public function getDisplayName();
    }
    
Loading history...
375
    }
376
377
    function yy_r1_7()
378
    {
379
380
        if ($this->smarty->auto_literal && isset($this->value[ $this->ldel_length ]) ?
381
            strpos(" \n\t\r", $this->value[ $this->ldel_length ]) !== false : false
382
        ) {
383
            $this->token = Smarty_Internal_Templateparser::TP_TEXT;
384
        } else {
385
            $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART;
386
            $this->yypushstate(self::LITERAL);
387
        }
388
    }
389
390
    function yy_r1_8()
391
    {
392
393
        if ($this->smarty->auto_literal && isset($this->value[ $this->ldel_length ]) ?
394
            strpos(" \n\t\r", $this->value[ $this->ldel_length ]) !== false : false
395
        ) {
396
            $this->token = Smarty_Internal_Templateparser::TP_TEXT;
397
        } else {
398
            $this->yypushstate(self::TAG);
399
            return true;
400
        }
401
    }
402
403
    function yy_r1_9()
404
    {
405
406
        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
407
    }
408
409
    function yy_r1_10()
410
    {
411
412
        $this->compiler->getTagCompiler('private_php')->parsePhp($this);
0 ignored issues
show
Bug introduced by
It seems like you code against a specific sub-type and not the parent class Smarty_Internal_CompileBase as the method parsePhp() does only exist in the following sub-classes of Smarty_Internal_CompileBase: Smarty_Internal_Compile_Private_Php. Maybe you want to instanceof check for one of these explicitly?

Let’s take a look at an example:

abstract class User
{
    /** @return string */
    abstract public function getPassword();
}

class MyUser extends User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different sub-classes of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the parent class:

    abstract class User
    {
        /** @return string */
        abstract public function getPassword();
    
        /** @return string */
        abstract public function getDisplayName();
    }
    
Loading history...
413
    }
414
415
    function yy_r1_19()
416
    {
417
418
        $to = $this->dataLength;
419
        preg_match("/($this->ldel)|(<[?]((php\s+|=)|\s+))|(<[%])|(<[?]xml\s+)|(<script\s+language\s*=\s*[\"']?\s*php\s*[\"']?\s*>)|([?][>])|([%][>])/i",
420
                   $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter);
421
        if (isset($match[ 0 ][ 1 ])) {
422
            $to = $match[ 0 ][ 1 ];
423
        }
424
        $this->value = substr($this->data, $this->counter, $to - $this->counter);
425
        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
426
    }
427
428
    public function yylex2()
429
    {
430
        if (!isset($this->yy_global_pattern2)) {
431
            $this->yy_global_pattern2 =
432
                "/\G(" . $this->ldel . "\\s*(if|elseif|else if|while)\\s+)|\G(" . $this->ldel . "\\s*for\\s+)|\G(" .
433
                $this->ldel . "\\s*foreach(?![^\s]))|\G(" . $this->ldel . "\\s*setfilter\\s+)|\G(" . $this->ldel .
434
                "\\s*make_nocache\\s+)|\G(" . $this->ldel . "\\s*[0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*" . $this->rdel .
435
                ")|\G(" . $this->ldel . "\\s*[\/](?:(?!block)[0-9]*[a-zA-Z_]\\w*)\\s*" . $this->rdel . ")|\G(" .
436
                $this->ldel . "\\s*[$][0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*" . $this->rdel . ")|\G(" . $this->ldel .
437
                "\\s*[\/])|\G(" . $this->ldel . "\\s*)/isS";
438
        }
439
        if (!isset($this->dataLength)) {
440
            $this->dataLength = strlen($this->data);
441
        }
442
        if ($this->counter >= $this->dataLength) {
443
            return false; // end of input
444
        }
445
446
        do {
447
            if (preg_match($this->yy_global_pattern2, $this->data, $yymatches, null, $this->counter)) {
448
                if (!isset($yymatches[ 0 ][ 1 ])) {
449
                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
450
                } else {
451
                    $yymatches = array_filter($yymatches);
452
                }
453
                if (empty($yymatches)) {
454
                    throw new Exception('Error: lexing failed because a rule matched' . ' an empty string.  Input "' .
455
                                        substr($this->data, $this->counter, 5) . '... state TAG');
456
                }
457
                next($yymatches); // skip global match
458
                $this->token = key($yymatches); // token number
459
                $this->value = current($yymatches); // token value
460
                $r = $this->{'yy_r2_' . $this->token}();
461
                if ($r === null) {
462
                    $this->counter += strlen($this->value);
463
                    $this->line += substr_count($this->value, "\n");
464
                    // accept this token
465
                    return true;
466
                } elseif ($r === true) {
467
                    // we have changed state
468
                    // process this token in the new state
469
                    return $this->yylex();
470
                } elseif ($r === false) {
471
                    $this->counter += strlen($this->value);
472
                    $this->line += substr_count($this->value, "\n");
473
                    if ($this->counter >= $this->dataLength) {
474
                        return false; // end of input
475
                    }
476
                    // skip this token
477
                    continue;
478
                }
479
            } else {
480
                throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]);
481
            }
482
            break;
483
        }
484
        while (true);
485
    } // end function
486
487
    const TAG = 2;
488
489
    function yy_r2_1()
490
    {
491
492
        $this->token = Smarty_Internal_Templateparser::TP_LDELIF;
493
        $this->yybegin(self::TAGBODY);
494
        $this->taglineno = $this->line;
495
    }
496
497
    function yy_r2_3()
498
    {
499
500
        $this->token = Smarty_Internal_Templateparser::TP_LDELFOR;
501
        $this->yybegin(self::TAGBODY);
502
        $this->taglineno = $this->line;
503
    }
504
505
    function yy_r2_4()
506
    {
507
508
        $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH;
509
        $this->yybegin(self::TAGBODY);
510
        $this->taglineno = $this->line;
511
    }
512
513
    function yy_r2_5()
514
    {
515
516
        $this->token = Smarty_Internal_Templateparser::TP_LDELSETFILTER;
517
        $this->yybegin(self::TAGBODY);
518
        $this->taglineno = $this->line;
519
    }
520
521
    function yy_r2_6()
522
    {
523
524
        $this->token = Smarty_Internal_Templateparser::TP_LDELMAKENOCACHE;
525
        $this->yybegin(self::TAGBODY);
526
        $this->taglineno = $this->line;
527
    }
528
529
    function yy_r2_7()
530
    {
531
532
        $this->yypopstate();
533
        $this->token = Smarty_Internal_Templateparser::TP_SIMPLETAG;
534
        $this->taglineno = $this->line;
535
    }
536
537
    function yy_r2_9()
538
    {
539
540
        $this->yypopstate();
541
        $this->token = Smarty_Internal_Templateparser::TP_CLOSETAG;
542
        $this->taglineno = $this->line;
543
    }
544
545
    function yy_r2_10()
546
    {
547
548
        if ($this->_yy_stack[ count($this->_yy_stack) - 1 ] == self::TEXT) {
549
            $this->yypopstate();
550
            $this->token = Smarty_Internal_Templateparser::TP_SIMPELOUTPUT;
551
            $this->taglineno = $this->line;
552
        } else {
553
            $this->value = $this->smarty->left_delimiter;
554
            $this->token = Smarty_Internal_Templateparser::TP_LDEL;
555
            $this->yybegin(self::TAGBODY);
556
            $this->taglineno = $this->line;
557
        }
558
    }
559
560
    function yy_r2_12()
561
    {
562
563
        $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
564
        $this->yybegin(self::TAGBODY);
565
        $this->taglineno = $this->line;
566
    }
567
568
    function yy_r2_13()
569
    {
570
571
        $this->token = Smarty_Internal_Templateparser::TP_LDEL;
572
        $this->yybegin(self::TAGBODY);
573
        $this->taglineno = $this->line;
574
    }
575
576
    public function yylex3()
577
    {
578
        if (!isset($this->yy_global_pattern3)) {
579
            $this->yy_global_pattern3 = "/\G(\\s*" . $this->rdel . ")|\G(" . $this->ldel .
580
                                        "\\s*)|\G([\"])|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G([$]smarty\\.block\\.(child|parent))|\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([#])|\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";
581
        }
582
        if (!isset($this->dataLength)) {
583
            $this->dataLength = strlen($this->data);
584
        }
585
        if ($this->counter >= $this->dataLength) {
586
            return false; // end of input
587
        }
588
589
        do {
590
            if (preg_match($this->yy_global_pattern3, $this->data, $yymatches, null, $this->counter)) {
591
                if (!isset($yymatches[ 0 ][ 1 ])) {
592
                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
593
                } else {
594
                    $yymatches = array_filter($yymatches);
595
                }
596
                if (empty($yymatches)) {
597
                    throw new Exception('Error: lexing failed because a rule matched' . ' an empty string.  Input "' .
598
                                        substr($this->data, $this->counter, 5) . '... state TAGBODY');
599
                }
600
                next($yymatches); // skip global match
601
                $this->token = key($yymatches); // token number
602
                $this->value = current($yymatches); // token value
603
                $r = $this->{'yy_r3_' . $this->token}();
604
                if ($r === null) {
605
                    $this->counter += strlen($this->value);
606
                    $this->line += substr_count($this->value, "\n");
607
                    // accept this token
608
                    return true;
609
                } elseif ($r === true) {
610
                    // we have changed state
611
                    // process this token in the new state
612
                    return $this->yylex();
613
                } elseif ($r === false) {
614
                    $this->counter += strlen($this->value);
615
                    $this->line += substr_count($this->value, "\n");
616
                    if ($this->counter >= $this->dataLength) {
617
                        return false; // end of input
618
                    }
619
                    // skip this token
620
                    continue;
621
                }
622
            } else {
623
                throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]);
624
            }
625
            break;
626
        }
627
        while (true);
628
    } // end function
629
630
    const TAGBODY = 3;
631
632
    function yy_r3_1()
633
    {
634
635
        $this->token = Smarty_Internal_Templateparser::TP_RDEL;
636
        $this->yypopstate();
637
    }
638
639
    function yy_r3_2()
640
    {
641
642
        if ($this->smarty->auto_literal && isset($this->value[ $this->ldel_length ]) ?
643
            strpos(" \n\t\r", $this->value[ $this->ldel_length ]) !== false : false
644
        ) {
645
            $this->token = Smarty_Internal_Templateparser::TP_TEXT;
646
        } else {
647
            $this->yypushstate(self::TAG);
648
            return true;
649
        }
650
    }
651
652
    function yy_r3_3()
653
    {
654
655
        $this->token = Smarty_Internal_Templateparser::TP_QUOTE;
656
        $this->yypushstate(self::DOUBLEQUOTEDSTRING);
657
    }
658
659
    function yy_r3_4()
660
    {
661
662
        $this->token = Smarty_Internal_Templateparser::TP_SINGLEQUOTESTRING;
663
    }
664
665
    function yy_r3_5()
666
    {
667
668
        $this->token = Smarty_Internal_Templateparser::TP_SMARTYBLOCKCHILDPARENT;
669
        $this->taglineno = $this->line;
670
    }
671
672
    function yy_r3_7()
673
    {
674
675
        $this->token = Smarty_Internal_Templateparser::TP_DOLLARID;
676
    }
677
678
    function yy_r3_8()
679
    {
680
681
        $this->token = Smarty_Internal_Templateparser::TP_DOLLAR;
682
    }
683
684
    function yy_r3_9()
685
    {
686
687
        $this->token = Smarty_Internal_Templateparser::TP_ISIN;
688
    }
689
690
    function yy_r3_10()
691
    {
692
693
        $this->token = Smarty_Internal_Templateparser::TP_AS;
694
    }
695
696
    function yy_r3_11()
697
    {
698
699
        $this->token = Smarty_Internal_Templateparser::TP_TO;
700
    }
701
702
    function yy_r3_12()
703
    {
704
705
        $this->token = Smarty_Internal_Templateparser::TP_STEP;
706
    }
707
708
    function yy_r3_13()
709
    {
710
711
        $this->token = Smarty_Internal_Templateparser::TP_INSTANCEOF;
712
    }
713
714
    function yy_r3_14()
715
    {
716
717
        $this->token = Smarty_Internal_Templateparser::TP_LOGOP;
718
    }
719
720
    function yy_r3_19()
721
    {
722
723
        $this->token = Smarty_Internal_Templateparser::TP_SLOGOP;
724
    }
725
726
    function yy_r3_21()
727
    {
728
729
        $this->token = Smarty_Internal_Templateparser::TP_TLOGOP;
730
    }
731
732
    function yy_r3_25()
733
    {
734
735
        $this->token = Smarty_Internal_Templateparser::TP_SINGLECOND;
736
    }
737
738
    function yy_r3_28()
739
    {
740
741
        $this->token = Smarty_Internal_Templateparser::TP_NOT;
742
    }
743
744
    function yy_r3_31()
745
    {
746
747
        $this->token = Smarty_Internal_Templateparser::TP_TYPECAST;
748
    }
749
750
    function yy_r3_35()
751
    {
752
753
        $this->token = Smarty_Internal_Templateparser::TP_OPENP;
754
    }
755
756
    function yy_r3_36()
757
    {
758
759
        $this->token = Smarty_Internal_Templateparser::TP_CLOSEP;
760
    }
761
762
    function yy_r3_37()
763
    {
764
765
        $this->token = Smarty_Internal_Templateparser::TP_OPENB;
766
    }
767
768
    function yy_r3_38()
769
    {
770
771
        $this->token = Smarty_Internal_Templateparser::TP_CLOSEB;
772
    }
773
774
    function yy_r3_39()
775
    {
776
777
        $this->token = Smarty_Internal_Templateparser::TP_PTR;
778
    }
779
780
    function yy_r3_40()
781
    {
782
783
        $this->token = Smarty_Internal_Templateparser::TP_APTR;
784
    }
785
786
    function yy_r3_41()
787
    {
788
789
        $this->token = Smarty_Internal_Templateparser::TP_EQUAL;
790
    }
791
792
    function yy_r3_42()
793
    {
794
795
        $this->token = Smarty_Internal_Templateparser::TP_INCDEC;
796
    }
797
798
    function yy_r3_44()
799
    {
800
801
        $this->token = Smarty_Internal_Templateparser::TP_UNIMATH;
802
    }
803
804
    function yy_r3_46()
805
    {
806
807
        $this->token = Smarty_Internal_Templateparser::TP_MATH;
808
    }
809
810
    function yy_r3_48()
811
    {
812
813
        $this->token = Smarty_Internal_Templateparser::TP_AT;
814
    }
815
816
    function yy_r3_49()
817
    {
818
819
        $this->token = Smarty_Internal_Templateparser::TP_HATCH;
820
    }
821
822
    function yy_r3_50()
823
    {
824
825
        // resolve conflicts with shorttag and right_delimiter starting with '='
826
        if (substr($this->data, $this->counter + strlen($this->value) - 1, $this->rdel_length) ==
827
            $this->smarty->right_delimiter
828
        ) {
829
            preg_match("/\s+/", $this->value, $match);
830
            $this->value = $match[ 0 ];
831
            $this->token = Smarty_Internal_Templateparser::TP_SPACE;
832
        } else {
833
            $this->token = Smarty_Internal_Templateparser::TP_ATTR;
834
        }
835
    }
836
837
    function yy_r3_51()
838
    {
839
840
        $this->token = Smarty_Internal_Templateparser::TP_NAMESPACE;
841
    }
842
843
    function yy_r3_54()
844
    {
845
846
        $this->token = Smarty_Internal_Templateparser::TP_ID;
847
    }
848
849
    function yy_r3_55()
850
    {
851
852
        $this->token = Smarty_Internal_Templateparser::TP_INTEGER;
853
    }
854
855
    function yy_r3_56()
856
    {
857
858
        $this->token = Smarty_Internal_Templateparser::TP_BACKTICK;
859
        $this->yypopstate();
860
    }
861
862
    function yy_r3_57()
863
    {
864
865
        $this->token = Smarty_Internal_Templateparser::TP_VERT;
866
    }
867
868
    function yy_r3_58()
869
    {
870
871
        $this->token = Smarty_Internal_Templateparser::TP_DOT;
872
    }
873
874
    function yy_r3_59()
875
    {
876
877
        $this->token = Smarty_Internal_Templateparser::TP_COMMA;
878
    }
879
880
    function yy_r3_60()
881
    {
882
883
        $this->token = Smarty_Internal_Templateparser::TP_SEMICOLON;
884
    }
885
886
    function yy_r3_61()
887
    {
888
889
        $this->token = Smarty_Internal_Templateparser::TP_DOUBLECOLON;
890
    }
891
892
    function yy_r3_62()
893
    {
894
895
        $this->token = Smarty_Internal_Templateparser::TP_COLON;
896
    }
897
898
    function yy_r3_63()
899
    {
900
901
        $this->token = Smarty_Internal_Templateparser::TP_QMARK;
902
    }
903
904
    function yy_r3_64()
905
    {
906
907
        $this->token = Smarty_Internal_Templateparser::TP_HEX;
908
    }
909
910
    function yy_r3_65()
911
    {
912
913
        $this->token = Smarty_Internal_Templateparser::TP_SPACE;
914
    }
915
916
    function yy_r3_66()
917
    {
918
919
        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
920
    }
921
922
    public function yylex4()
923
    {
924
        if (!isset($this->yy_global_pattern4)) {
925
            $this->yy_global_pattern4 =
926
                "/\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/]literal\\s*" .
927
                $this->rdel . ")|\G([\S\s])/isS";
928
        }
929
        if (!isset($this->dataLength)) {
930
            $this->dataLength = strlen($this->data);
931
        }
932
        if ($this->counter >= $this->dataLength) {
933
            return false; // end of input
934
        }
935
936
        do {
937
            if (preg_match($this->yy_global_pattern4, $this->data, $yymatches, null, $this->counter)) {
938
                if (!isset($yymatches[ 0 ][ 1 ])) {
939
                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
940
                } else {
941
                    $yymatches = array_filter($yymatches);
942
                }
943
                if (empty($yymatches)) {
944
                    throw new Exception('Error: lexing failed because a rule matched' . ' an empty string.  Input "' .
945
                                        substr($this->data, $this->counter, 5) . '... state LITERAL');
946
                }
947
                next($yymatches); // skip global match
948
                $this->token = key($yymatches); // token number
949
                $this->value = current($yymatches); // token value
950
                $r = $this->{'yy_r4_' . $this->token}();
951
                if ($r === null) {
952
                    $this->counter += strlen($this->value);
953
                    $this->line += substr_count($this->value, "\n");
954
                    // accept this token
955
                    return true;
956
                } elseif ($r === true) {
957
                    // we have changed state
958
                    // process this token in the new state
959
                    return $this->yylex();
960
                } elseif ($r === false) {
961
                    $this->counter += strlen($this->value);
962
                    $this->line += substr_count($this->value, "\n");
963
                    if ($this->counter >= $this->dataLength) {
964
                        return false; // end of input
965
                    }
966
                    // skip this token
967
                    continue;
968
                }
969
            } else {
970
                throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]);
971
            }
972
            break;
973
        }
974
        while (true);
975
    } // end function
976
977
    const LITERAL = 4;
978
979
    function yy_r4_1()
980
    {
981
982
        $this->literal_cnt ++;
983
        $this->token = Smarty_Internal_Templateparser::TP_LITERAL;
984
    }
985
986
    function yy_r4_2()
987
    {
988
989
        if ($this->literal_cnt) {
990
            $this->literal_cnt --;
991
            $this->token = Smarty_Internal_Templateparser::TP_LITERAL;
992
        } else {
993
            $this->token = Smarty_Internal_Templateparser::TP_LITERALEND;
994
            $this->yypopstate();
995
        }
996
    }
997
998
    function yy_r4_3()
999
    {
1000
1001
        $to = $this->dataLength;
1002
        preg_match("/{$this->ldel}[\/]?literal{$this->rdel}/i", $this->data, $match, PREG_OFFSET_CAPTURE,
1003
                   $this->counter);
1004
        if (isset($match[ 0 ][ 1 ])) {
1005
            $to = $match[ 0 ][ 1 ];
1006
        } else {
1007
            $this->compiler->trigger_template_error("missing or misspelled literal closing tag");
1008
        }
1009
        $this->value = substr($this->data, $this->counter, $to - $this->counter);
1010
        $this->token = Smarty_Internal_Templateparser::TP_LITERAL;
1011
    }
1012
1013
    public function yylex5()
1014
    {
1015
        if (!isset($this->yy_global_pattern5)) {
1016
            $this->yy_global_pattern5 =
1017
                "/\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/]literal\\s*" .
1018
                $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/])|\G(" . $this->ldel . "\\s*[0-9]*[a-zA-Z_]\\w*)|\G(" .
1019
                $this->ldel .
1020
                "\\s*)|\G([\"])|\G([`][$])|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(([^\"\\\\]*?)((?:\\\\.[^\"\\\\]*?)*?)(?=(" .
1021
                $this->ldel . "|\\$|`\\$|\")))|\G([\S\s])/isS";
1022
        }
1023
        if (!isset($this->dataLength)) {
1024
            $this->dataLength = strlen($this->data);
1025
        }
1026
        if ($this->counter >= $this->dataLength) {
1027
            return false; // end of input
1028
        }
1029
1030
        do {
1031
            if (preg_match($this->yy_global_pattern5, $this->data, $yymatches, null, $this->counter)) {
1032
                if (!isset($yymatches[ 0 ][ 1 ])) {
1033
                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
1034
                } else {
1035
                    $yymatches = array_filter($yymatches);
1036
                }
1037
                if (empty($yymatches)) {
1038
                    throw new Exception('Error: lexing failed because a rule matched' . ' an empty string.  Input "' .
1039
                                        substr($this->data, $this->counter, 5) . '... state DOUBLEQUOTEDSTRING');
1040
                }
1041
                next($yymatches); // skip global match
1042
                $this->token = key($yymatches); // token number
1043
                $this->value = current($yymatches); // token value
1044
                $r = $this->{'yy_r5_' . $this->token}();
1045
                if ($r === null) {
1046
                    $this->counter += strlen($this->value);
1047
                    $this->line += substr_count($this->value, "\n");
1048
                    // accept this token
1049
                    return true;
1050
                } elseif ($r === true) {
1051
                    // we have changed state
1052
                    // process this token in the new state
1053
                    return $this->yylex();
1054
                } elseif ($r === false) {
1055
                    $this->counter += strlen($this->value);
1056
                    $this->line += substr_count($this->value, "\n");
1057
                    if ($this->counter >= $this->dataLength) {
1058
                        return false; // end of input
1059
                    }
1060
                    // skip this token
1061
                    continue;
1062
                }
1063
            } else {
1064
                throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]);
1065
            }
1066
            break;
1067
        }
1068
        while (true);
1069
    } // end function
1070
1071
    const DOUBLEQUOTEDSTRING = 5;
1072
1073
    function yy_r5_1()
1074
    {
1075
1076
        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
1077
    }
1078
1079
    function yy_r5_2()
1080
    {
1081
1082
        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
1083
    }
1084
1085
    function yy_r5_3()
1086
    {
1087
1088
        if ($this->smarty->auto_literal && isset($this->value[ $this->ldel_length ]) ?
1089
            strpos(" \n\t\r", $this->value[ $this->ldel_length ]) !== false : false
1090
        ) {
1091
            $this->token = Smarty_Internal_Templateparser::TP_TEXT;
1092
        } else {
1093
            $this->yypushstate(self::TAG);
1094
            return true;
1095
        }
1096
    }
1097
1098
    function yy_r5_4()
1099
    {
1100
1101
        if ($this->smarty->auto_literal && isset($this->value[ $this->ldel_length ]) ?
1102
            strpos(" \n\t\r", $this->value[ $this->ldel_length ]) !== false : false
1103
        ) {
1104
            $this->token = Smarty_Internal_Templateparser::TP_TEXT;
1105
        } else {
1106
            $this->yypushstate(self::TAG);
1107
            return true;
1108
        }
1109
    }
1110
1111
    function yy_r5_5()
1112
    {
1113
1114
        if ($this->smarty->auto_literal && isset($this->value[ $this->ldel_length ]) ?
1115
            strpos(" \n\t\r", $this->value[ $this->ldel_length ]) !== false : false
1116
        ) {
1117
            $this->token = Smarty_Internal_Templateparser::TP_TEXT;
1118
        } else {
1119
            $this->token = Smarty_Internal_Templateparser::TP_LDEL;
1120
            $this->taglineno = $this->line;
1121
            $this->yypushstate(self::TAGBODY);
1122
        }
1123
    }
1124
1125
    function yy_r5_6()
1126
    {
1127
1128
        $this->token = Smarty_Internal_Templateparser::TP_QUOTE;
1129
        $this->yypopstate();
1130
    }
1131
1132
    function yy_r5_7()
1133
    {
1134
1135
        $this->token = Smarty_Internal_Templateparser::TP_BACKTICK;
1136
        $this->value = substr($this->value, 0, - 1);
1137
        $this->yypushstate(self::TAGBODY);
1138
        $this->taglineno = $this->line;
1139
    }
1140
1141
    function yy_r5_8()
1142
    {
1143
1144
        $this->token = Smarty_Internal_Templateparser::TP_DOLLARID;
1145
    }
1146
1147
    function yy_r5_9()
1148
    {
1149
1150
        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
1151
    }
1152
1153
    function yy_r5_10()
1154
    {
1155
1156
        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
1157
    }
1158
1159
    function yy_r5_14()
1160
    {
1161
1162
        $to = $this->dataLength;
1163
        $this->value = substr($this->data, $this->counter, $to - $this->counter);
1164
        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
1165
    }
1166
1167
}
1168
1169
1170