diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 657b840..15f4a3c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -105,6 +105,43 @@ jobs: - name: Run tests run: composer test-unit + # Parse every case of tests/fixtures/parity with this package and with the + # cphalcon C parser and fail on any difference outside the allow-list + differential: + name: "Differential vs ext-phalcon" + needs: phpcs + runs-on: ubuntu-latest + + permissions: + contents: read + + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - name: Setup PHP with ext-phalcon + uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # v2 + with: + php-version: '8.3' + extensions: mbstring, ctype, phalcon-5.23.0 + coverage: none + tools: composer:v2 + env: + COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Install dependencies + uses: ramsey/composer-install@26d8a556604053a9612623447203a691f406fbe6 # v4 + with: + composer-options: "--prefer-dist" + + # tests/differential.php exits 0 when the extension is missing + - name: Assert the extension is actually loaded + run: php -m | grep -qi '^phalcon$' + + - name: Compare against the C parser + run: php tests/differential.php + coverage: name: Code Coverage needs: tests diff --git a/CHANGELOG.md b/CHANGELOG.md index e69de29..b0978c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -0,0 +1,29 @@ +# Changelog + +All notable changes are documented here. The format is based on [Keep a Changelog][keep_a_changelog] and this project adheres to [Semantic Versioning][semantic_versioning]. + +## [Unreleased](https://github.com/phalcon/volt/releases/tag/vx.x.x) (2026-xx-xx) + +### Changed + +- The scanner and the parser are written by hand instead of being transliterated from cphalcon's re2c scanner and Lemon parser; `resources/files/parser.php` and the global `phvolt_*` functions are gone. +- `Phalcon\Volt\Parser\Parser::setDebug()` and `setDebugFile()` are deprecated; the debug file now receives a shift/reduce trace. +- `Phalcon\Volt\Scanner\State` and `Phalcon\Volt\Scanner\Token` only hold scanner state; `Phalcon\Volt\Scanner\Opcode` and `Phalcon\Volt\Parser\Status` were removed. + +### Added + +- Parity tests against ext-phalcon: a template corpus with goldens recorded from cphalcon (`tests/generate-golden.php`), `FixturesTest`, and `tests/differential.php`, run in CI. + +### Fixed + +Parsing now matches cphalcon exactly. Previously: + +- syntax errors showed the previous token's value, and dropped empty, `"0"` or blank values: `unexpected token ~(id)` instead of `unexpected token ~`; +- scanning errors quoted one character instead of the rest of the template; +- deeply nested templates were accepted instead of failing with "Parsing failed, the template expression is nested too deeply"; +- blank text between the blocks of a child template was kept instead of dropped; +- a NUL byte did not end the template; +- `{# 0 #}` ended the template. + +[keep_a_changelog]: https://keepachangelog.com/en/1.1.0/ +[semantic_versioning]: https://semver.org/spec/v2.0.0.html diff --git a/README.md b/README.md index a6fffd2..5edc466 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,138 @@ This repository consists of the Volt parser, for the Volt Template Engine used by the Phalcon Framework. +## What this is + +Phalcon v6 is a pure-PHP rewrite of [cphalcon](https://github.com/phalcon/cphalcon), +the C extension behind Phalcon v5. This package is the Volt template parser for +v6, and it is a behavioural port of cphalcon's: the same intermediate +representation, key order and integer types included, the same line numbers, +the same error messages on the same tokens, and the same limit on how deeply a +template may nest. A template that parses (or fails) one way under v5 parses +(or fails) the same way here. + +The scanner and the parser are written by hand. cphalcon generates its own from +a re2c scanner and a Lemon grammar; earlier versions of this package carried PHP +transliterations of those generated artefacts. + +## Requirements + +* PHP `>= 8.1 < 9.0` +* `ext-ctype`, `ext-mbstring` + +## Installation + +```bash +composer require phalcon/volt +``` + +## Usage + +```php +use Phalcon\Volt\Parser\Parser; + +$statements = (new Parser())->parse('{% for user in users %}{{ user.name }}{% endfor %}', 'users.volt'); +``` + +`parse()` returns the list of statements, or throws `Phalcon\Volt\Exception` with +cphalcon's message. `Phalcon\Volt\Compiler` turns the statements into PHP; the +node `type` values are the cases of `Phalcon\Volt\Compiler\Opcode`. + +## How it works + +| Class | Role | cphalcon counterpart | +|---|---|---| +| `Scanner\Scanner` | Turns the template into tokens: raw text, comments, verbatim blocks, and the tokens inside `{{ }}` / `{% %}` | `scanner.re` | +| `Parser\TokenStream` | Feeds tokens to the parser one at a time, running the template checks (child templates, nested blocks, `extends` first, ...) | the token loop in `base.c` | +| `Parser\Parser` | Statements, by recursive descent - one method per grammar rule | `parser.php.lemon` | +| `Parser\ExpressionParser` | Expressions, by precedence climbing over the grammar's own precedence table | `parser.php.lemon` | +| `Parser\Cursor` | One token of lookahead plus an emulation of Lemon's parser stack | the generated `parser.c` | +| `Parser\Ast` | Builds the nodes | `parser.php.inc.h` | + +Tokens are scanned on demand rather than up front, because cphalcon checks each +token before parsing it: a check on a later token must not pre-empt a syntax +error that cphalcon reports on an earlier one. + +## Compatibility notes + +Everything below is cphalcon's behaviour, reproduced on purpose and pinned by the +parity tests. + +* **Operator precedence follows the grammar, not intuition.** `* / %` bind + *looser* than `+ - ~`, so `1 + 2 * 3` is `(1 + 2) * 3`. Prefix `!` binds + tighter than `[]` and `|`: `!a[0]` is `(!a)[0]`. `not in` binds much tighter + than `in`, and the ternary groups to the left. +* **`**` and `//` are two tokens each**: `a * * b` is a power, `a / / b` a + modulo. +* **Line numbers are those of the next token.** A node's `line` is where the + parser was when it finished the node, which is after reading the token that + follows it - including any newlines in raw text in between. +* **Nesting fails closed** with "Parsing failed, the template expression is + nested too deeply" at exactly the depth cphalcon's 100-entry Lemon stack + overflows (for example 97 nested parentheses, or 24 nested `{% if %}`). +* **Error messages keep cphalcon's token names**: `!` for `not`, `%%` for `%`, + `NOT EQUALS` for `!=` / `<>` / `is not`, `UNKNOWN` for `|`, `null`, `true`, + `false` and a few keywords. The token's value is shown only for value tokens, + verbatim: `STRING()` for `""`. +* **An error on the last byte reads as end of input**: `{{ 1 + }}` reports + "unexpected EOF", followed by the blocks left open. +* **`{% for x in y if cond %}` counts as an opened `if`** that is never closed; + a `{% block %}` later in the same template is then reported as nested. +* **A NUL byte ends the template**, as it ends a C string. +* **Values are not unescaped and numbers stay strings.** + +## Deliberate differences from cphalcon + +* `{% cache %}` / `{% endcache %}` were removed: `cache` and `endcache` are plain + identifiers here. +* In two situations cphalcon's syntax-error message prints freed memory (after a + blank raw fragment of a child template is dropped, and after `{% default %}`). + This package prints no value there. Where the freed value is empty, cphalcon + deterministically prints `()`, and so does this package. + +## Development + +```bash +composer install +composer test-unit # PHPUnit +composer analyze # PHPStan, level max +composer cs # PHP_CodeSniffer +composer cs-fixer-fix # php-cs-fixer +``` + +### Verifying against the C parser + +The parity corpus in `tests/fixtures/parity/*.php` lists templates: the snippets +of cphalcon's, phalcon's and this package's test suites +(`tests/harvest-corpus.php` collects them) plus hand-written groups for +precedence, line numbers, errors, scanner edge cases and nesting depth. + +* `tests/generate-golden.php` runs every template through ext-phalcon and + records the outcome in `tests/fixtures/parity/*.json`. It refuses to run + without the extension, so the goldens always come from cphalcon. +* `tests/unit/Parser/FixturesTest.php` replays the goldens against this package. +* `tests/differential.php` compares both implementations live. It exits quietly + without the extension. + +```bash +php -d extension=phalcon tests/generate-golden.php # after changing the corpus +php -d extension=phalcon tests/differential.php +``` + +Deliberate differences are listed, with the expected outcome and a reason, in +`tests/fixtures/parity/allow-list.php`. + +## Why a hand-written parser + +The re2c DFA and the Lemon tables are build artefacts: thousands of lines that +nobody can review, that hide the grammar, and that had drifted from cphalcon in +several places (error values, scanner errors, NUL bytes, the nesting limit, +child-template whitespace). The grammar itself is small - 154 rules - and every +shift/reduce decision Lemon makes comes from a 15-level precedence table. A +precedence-climbing parser over that table, plus a counter that mirrors Lemon's +stack, reproduces the generated parser exactly while staying readable: each +parser method quotes the grammar rules it implements. + [packagist-version-badge]: https://img.shields.io/packagist/v/phalcon/volt?include_prereleases&style=flat-square [packagist-version-link]: https://packagist.org/packages/phalcon/volt diff --git a/composer.json b/composer.json index 5dbfb5b..b856416 100644 --- a/composer.json +++ b/composer.json @@ -62,14 +62,12 @@ "autoload": { "psr-4": { "Phalcon\\Volt\\": "src/" - }, - "files": [ - "resources/files/parser.php" - ] + } }, "autoload-dev": { "psr-4": { - "Phalcon\\Tests\\Unit\\": "tests/unit/" + "Phalcon\\Tests\\Unit\\": "tests/unit/", + "Phalcon\\Tests\\Support\\": "tests/support/" } }, "scripts": { diff --git a/resources/docker/develop/Dockerfile b/resources/docker/develop/Dockerfile index baf7c4a..17804ae 100644 --- a/resources/docker/develop/Dockerfile +++ b/resources/docker/develop/Dockerfile @@ -46,7 +46,14 @@ apt-get install -yq --no-install-recommends \ zip # Dev/test extensions install-php-extensions \ + phalcon-5.23.0 \ xdebug +# ext-phalcon is the reference implementation for the parity scripts only +# (tests/generate-golden.php, tests/differential.php). It is not loaded by +# default so that the unit suite always exercises the pure-PHP parser. Load it +# on demand: +# php -d extension=phalcon tests/differential.php +rm -f /usr/local/etc/php/conf.d/docker-php-ext-phalcon.ini # Locales sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen dpkg-reconfigure --frontend=noninteractive locales diff --git a/resources/files/parser.php b/resources/files/parser.php deleted file mode 100644 index f192c77..0000000 --- a/resources/files/parser.php +++ /dev/null @@ -1,3605 +0,0 @@ -output; - } - - var /* int */ - $yyidx = -1; /* Index of top element in stack */ - var /* int */ - $yyerrcnt; /* Shifts left before out of the error */ - // phvolt_ARG_SDECL /* A place to hold %extra_argument */ - var $yystack = array(/* of YYSTACKDEPTH elements */ - ); /* The parser's stack */ - - var $yyTraceFILE = null; - var $yyTracePrompt = null; - - /* The next thing included is series of defines which control -** various aspects of the generated parser. -** YYCODETYPE is the data type used for storing terminal -** and nonterminal numbers. "unsigned char" is -** used if there are fewer than 250 terminals -** and nonterminals. "int" is used otherwise. -** YYNOCODE is a number of type YYCODETYPE which corresponds -** to no legal terminal or nonterminal number. This -** number is used to fill in empty slots of the hash -** table. -** YYFALLBACK If defined, this indicates that one or more tokens -** have fall-back values which should be used if the -** original value of the token will not parse. -** YYACTIONTYPE is the data type used for storing terminal -** and nonterminal numbers. "unsigned char" is -** used if there are fewer than 250 rules and -** states combined. "int" is used otherwise. -** phvolt_TOKENTYPE is the data type used for minor tokens given -** directly to the parser from the tokenizer. -** YYMINORTYPE is the data type used for all minor tokens. -** This is typically a union of many types, one of -** which is phvolt_TOKENTYPE. The entry in the union -** for base tokens is called "yy0". -** YYSTACKDEPTH is the maximum depth of the parser's stack. -** phvolt_ARG_SDECL A static variable declaration for the %extra_argument -** phvolt_ARG_PDECL A parameter declaration for the %extra_argument -** phvolt_ARG_STORE Code to store %extra_argument into yypParser -** phvolt_ARG_FETCH Code to extract %extra_argument from yypParser -** YYNSTATE the combined number of states. -** YYNRULE the number of rules in the grammar -** YYERRORSYMBOL is the code number of the error symbol. If not -** defined, then do no error processing. -*/ - const YYNOCODE = 127; -#define phvolt_TOKENTYPE phvolt_parser_token* - const YYSTACKDEPTH = 100; - const YYNSTATE = 352; - const YYNRULE = 154; - const YYERRORSYMBOL = 87; - - /* since we cant use expressions to initialize these as class - * constants, we do so during parser init. */ - var $YY_NO_ACTION = self::YYNSTATE + self::YYNRULE + 2; - var $YY_ERROR_ACTION = self::YYNSTATE + self::YYNRULE; - - /* Next are that tables used to determine what action to take based on the -** current state and lookahead token. These tables are used to implement -** functions that take a state number and lookahead value and return an -** action integer. -** -** Suppose the action integer is N. Then the action is determined as -** follows -** -** 0 <= N < YYNSTATE Shift N. That is, push the lookahead -** token onto the stack and goto state N. -** -** YYNSTATE <= N < YYNSTATE+YYNRULE Reduce by rule N-YYNSTATE. -** -** N == YYNSTATE+YYNRULE A syntax error has occurred. -** -** N == YYNSTATE+YYNRULE+1 The parser accepts its input. -** -** N == YYNSTATE+YYNRULE+2 No such action. Denotes unused -** slots in the yy_action[] table. -** -** The action table is constructed as a single large table named yy_action[]. -** Given state S and lookahead X, the action is computed as -** -** yy_action[ yy_shift_ofst[S] + X ] -** -** If the index value yy_shift_ofst[S]+X is out of range or if the value -** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X or if yy_shift_ofst[S] -** is equal to YY_SHIFT_USE_DFLT, it means that the action is not in the table -** and that yy_default[S] should be used instead. -** -** The formula above is for computing the action when the lookahead is -** a terminal symbol. If the lookahead is a non-terminal (as occurs after -** a reduce action) then the yy_reduce_ofst[] array is used in place of -** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of -** YY_SHIFT_USE_DFLT. -** -** The following are the tables generated in this section: -** -** yy_action[] A single table containing all actions. -** yy_lookahead[] A table containing the lookahead for each entry in -** yy_action. Used to detect hash collisions. -** yy_shift_ofst[] For each state, the offset into yy_action for -** shifting terminals. -** yy_reduce_ofst[] For each state, the offset into yy_action for -** shifting non-terminals after a reduce. -** yy_default[] Default action for each state. -*/ - static $yy_action = array( - /* 0 */ - 94, 195, 62, 54, 56, 84, 68, 64, 66, 74, - /* 10 */ - 76, 78, 80, 70, 72, 50, 48, 52, 45, 42, - /* 20 */ - 58, 91, 60, 86, 89, 90, 98, 82, 318, 175, - /* 30 */ - 94, 194, 62, 54, 56, 84, 68, 64, 66, 74, - /* 40 */ - 76, 78, 80, 70, 72, 50, 48, 52, 45, 42, - /* 50 */ - 58, 91, 60, 86, 89, 90, 98, 82, 94, 257, - /* 60 */ - 62, 54, 56, 84, 68, 64, 66, 74, 76, 78, - /* 70 */ - 80, 70, 72, 50, 48, 52, 45, 42, 58, 91, - /* 80 */ - 60, 86, 89, 90, 98, 82, 334, 329, 91, 60, - /* 90 */ - 86, 89, 90, 98, 82, 352, 325, 258, 193, 214, - /* 100 */ - 197, 94, 173, 62, 54, 56, 84, 68, 64, 66, - /* 110 */ - 74, 76, 78, 80, 70, 72, 50, 48, 52, 45, - /* 120 */ - 42, 58, 91, 60, 86, 89, 90, 98, 82, 94, - /* 130 */ - 28, 62, 54, 56, 84, 68, 64, 66, 74, 76, - /* 140 */ - 78, 80, 70, 72, 50, 48, 52, 45, 42, 58, - /* 150 */ - 91, 60, 86, 89, 90, 98, 82, 94, 41, 62, - /* 160 */ - 54, 56, 84, 68, 64, 66, 74, 76, 78, 80, - /* 170 */ - 70, 72, 50, 48, 52, 45, 42, 58, 91, 60, - /* 180 */ - 86, 89, 90, 98, 82, 50, 48, 52, 45, 42, - /* 190 */ - 58, 91, 60, 86, 89, 90, 98, 82, 308, 309, - /* 200 */ - 310, 311, 312, 313, 93, 196, 197, 248, 94, 96, - /* 210 */ - 62, 54, 56, 84, 68, 64, 66, 74, 76, 78, - /* 220 */ - 80, 70, 72, 50, 48, 52, 45, 42, 58, 91, - /* 230 */ - 60, 86, 89, 90, 98, 82, 94, 130, 62, 54, - /* 240 */ - 56, 84, 68, 64, 66, 74, 76, 78, 80, 70, - /* 250 */ - 72, 50, 48, 52, 45, 42, 58, 91, 60, 86, - /* 260 */ - 89, 90, 98, 82, 45, 42, 58, 91, 60, 86, - /* 270 */ - 89, 90, 98, 82, 86, 89, 90, 98, 82, 92, - /* 280 */ - 296, 314, 32, 251, 34, 104, 38, 129, 142, 94, - /* 290 */ - 119, 62, 54, 56, 84, 68, 64, 66, 74, 76, - /* 300 */ - 78, 80, 70, 72, 50, 48, 52, 45, 42, 58, - /* 310 */ - 91, 60, 86, 89, 90, 98, 82, 94, 182, 62, - /* 320 */ - 54, 56, 84, 68, 64, 66, 74, 76, 78, 80, - /* 330 */ - 70, 72, 50, 48, 52, 45, 42, 58, 91, 60, - /* 340 */ - 86, 89, 90, 98, 82, 94, 189, 62, 54, 56, - /* 350 */ - 84, 68, 64, 66, 74, 76, 78, 80, 70, 72, - /* 360 */ - 50, 48, 52, 45, 42, 58, 91, 60, 86, 89, - /* 370 */ - 90, 98, 82, 99, 268, 282, 27, 87, 106, 40, - /* 380 */ - 128, 141, 117, 106, 119, 136, 108, 119, 115, 119, - /* 390 */ - 119, 113, 210, 115, 119, 133, 94, 140, 62, 54, - /* 400 */ - 56, 84, 68, 64, 66, 74, 76, 78, 80, 70, - /* 410 */ - 72, 50, 48, 52, 45, 42, 58, 91, 60, 86, - /* 420 */ - 89, 90, 98, 82, 94, 254, 62, 54, 56, 84, - /* 430 */ - 68, 64, 66, 74, 76, 78, 80, 70, 72, 50, - /* 440 */ - 48, 52, 45, 42, 58, 91, 60, 86, 89, 90, - /* 450 */ - 98, 82, 94, 260, 62, 54, 56, 84, 68, 64, - /* 460 */ - 66, 74, 76, 78, 80, 70, 72, 50, 48, 52, - /* 470 */ - 45, 42, 58, 91, 60, 86, 89, 90, 98, 82, - /* 480 */ - 94, 263, 62, 54, 56, 84, 68, 64, 66, 74, - /* 490 */ - 76, 78, 80, 70, 72, 50, 48, 52, 45, 42, - /* 500 */ - 58, 91, 60, 86, 89, 90, 98, 82, 94, 266, - /* 510 */ - 62, 54, 56, 84, 68, 64, 66, 74, 76, 78, - /* 520 */ - 80, 70, 72, 50, 48, 52, 45, 42, 58, 91, - /* 530 */ - 60, 86, 89, 90, 98, 82, 94, 138, 62, 54, - /* 540 */ - 56, 84, 68, 64, 66, 74, 76, 78, 80, 70, - /* 550 */ - 72, 50, 48, 52, 45, 42, 58, 91, 60, 86, - /* 560 */ - 89, 90, 98, 82, 139, 320, 486, 94, 280, 62, - /* 570 */ - 54, 56, 84, 68, 64, 66, 74, 76, 78, 80, - /* 580 */ - 70, 72, 50, 48, 52, 45, 42, 58, 91, 60, - /* 590 */ - 86, 89, 90, 98, 82, 94, 336, 62, 54, 56, - /* 600 */ - 84, 68, 64, 66, 74, 76, 78, 80, 70, 72, - /* 610 */ - 50, 48, 52, 45, 42, 58, 91, 60, 86, 89, - /* 620 */ - 90, 98, 82, 94, 487, 62, 54, 56, 84, 68, - /* 630 */ - 64, 66, 74, 76, 78, 80, 70, 72, 50, 48, - /* 640 */ - 52, 45, 42, 58, 91, 60, 86, 89, 90, 226, - /* 650 */ - 82, 62, 54, 56, 84, 68, 64, 66, 74, 76, - /* 660 */ - 78, 80, 70, 72, 50, 48, 52, 45, 42, 58, - /* 670 */ - 91, 60, 86, 89, 90, 98, 82, 507, 1, 2, - /* 680 */ - 281, 4, 5, 6, 7, 8, 9, 10, 11, 12, - /* 690 */ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - /* 700 */ - 23, 24, 54, 56, 84, 68, 64, 66, 74, 76, - /* 710 */ - 78, 80, 70, 72, 50, 48, 52, 45, 42, 58, - /* 720 */ - 91, 60, 86, 89, 90, 98, 82, 29, 281, 4, - /* 730 */ - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - /* 740 */ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - /* 750 */ - 35, 281, 4, 5, 6, 7, 8, 9, 10, 11, - /* 760 */ - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - /* 770 */ - 22, 23, 24, 84, 68, 64, 66, 74, 76, 78, - /* 780 */ - 80, 70, 72, 50, 48, 52, 45, 42, 58, 91, - /* 790 */ - 60, 86, 89, 90, 98, 82, 176, 281, 4, 5, - /* 800 */ - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - /* 810 */ - 16, 17, 18, 19, 20, 21, 22, 23, 24, 183, - /* 820 */ - 281, 4, 5, 6, 7, 8, 9, 10, 11, 12, - /* 830 */ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - /* 840 */ - 23, 24, 220, 281, 4, 5, 6, 7, 8, 9, - /* 850 */ - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - /* 860 */ - 20, 21, 22, 23, 24, 230, 281, 4, 5, 6, - /* 870 */ - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - /* 880 */ - 17, 18, 19, 20, 21, 22, 23, 24, 238, 281, - /* 890 */ - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - /* 900 */ - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - /* 910 */ - 24, 270, 281, 4, 5, 6, 7, 8, 9, 10, - /* 920 */ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - /* 930 */ - 21, 22, 23, 24, 284, 281, 4, 5, 6, 7, - /* 940 */ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - /* 950 */ - 18, 19, 20, 21, 22, 23, 24, 299, 281, 4, - /* 960 */ - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - /* 970 */ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - /* 980 */ - 321, 281, 4, 5, 6, 7, 8, 9, 10, 11, - /* 990 */ - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - /* 1000 */ - 22, 23, 24, 330, 281, 4, 5, 6, 7, 8, - /* 1010 */ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - /* 1020 */ - 19, 20, 21, 22, 23, 24, 337, 281, 4, 5, - /* 1030 */ - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - /* 1040 */ - 16, 17, 18, 19, 20, 21, 22, 23, 24, 3, - /* 1050 */ - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - /* 1060 */ - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - /* 1070 */ - 24, 26, 234, 31, 33, 39, 169, 171, 353, 25, - /* 1080 */ - 180, 99, 187, 190, 192, 168, 141, 145, 227, 143, - /* 1090 */ - 486, 215, 119, 136, 44, 25, 119, 344, 144, 30, - /* 1100 */ - 224, 341, 140, 167, 235, 119, 242, 146, 252, 255, - /* 1110 */ - 487, 261, 264, 267, 119, 274, 276, 110, 68, 64, - /* 1120 */ - 66, 74, 76, 78, 80, 70, 72, 50, 48, 52, - /* 1130 */ - 45, 42, 58, 91, 60, 86, 89, 90, 98, 82, - /* 1140 */ - 278, 26, 234, 345, 347, 39, 169, 171, 36, 177, - /* 1150 */ - 180, 315, 187, 190, 192, 251, 278, 106, 278, 170, - /* 1160 */ - 278, 215, 278, 172, 179, 109, 208, 127, 119, 47, - /* 1170 */ - 224, 251, 211, 251, 235, 251, 242, 251, 252, 255, - /* 1180 */ - 119, 261, 264, 267, 110, 274, 276, 198, 200, 202, - /* 1190 */ - 204, 206, 130, 26, 234, 37, 99, 39, 169, 171, - /* 1200 */ - 184, 221, 180, 231, 187, 190, 192, 119, 131, 278, - /* 1210 */ - 278, 186, 278, 215, 212, 191, 216, 213, 49, 219, - /* 1220 */ - 217, 303, 224, 236, 251, 251, 235, 251, 242, 119, - /* 1230 */ - 252, 255, 51, 261, 264, 267, 53, 274, 276, 288, - /* 1240 */ - 223, 229, 228, 119, 233, 26, 234, 119, 55, 39, - /* 1250 */ - 169, 171, 239, 178, 180, 271, 187, 190, 192, 119, - /* 1260 */ - 285, 278, 278, 237, 278, 215, 241, 305, 114, 243, - /* 1270 */ - 57, 297, 244, 246, 224, 247, 251, 251, 235, 251, - /* 1280 */ - 242, 119, 252, 255, 59, 261, 264, 267, 61, 274, - /* 1290 */ - 276, 300, 249, 245, 250, 119, 269, 26, 234, 119, - /* 1300 */ - 278, 39, 169, 171, 322, 331, 180, 185, 187, 190, - /* 1310 */ - 192, 63, 338, 278, 65, 251, 278, 215, 67, 305, - /* 1320 */ - 273, 278, 119, 293, 294, 119, 224, 275, 251, 119, - /* 1330 */ - 235, 251, 242, 218, 252, 255, 251, 261, 264, 267, - /* 1340 */ - 69, 274, 276, 306, 277, 71, 73, 283, 75, 26, - /* 1350 */ - 234, 119, 278, 39, 169, 171, 119, 119, 180, 119, - /* 1360 */ - 187, 190, 192, 77, 287, 278, 278, 251, 79, 215, - /* 1370 */ - 290, 222, 292, 278, 119, 304, 317, 295, 224, 119, - /* 1380 */ - 251, 251, 235, 298, 242, 319, 252, 255, 251, 261, - /* 1390 */ - 264, 267, 81, 274, 276, 302, 119, 83, 85, 307, - /* 1400 */ - 88, 26, 234, 119, 95, 39, 169, 171, 119, 119, - /* 1410 */ - 180, 119, 187, 190, 192, 119, 324, 333, 97, 326, - /* 1420 */ - 327, 215, 101, 350, 340, 343, 103, 349, 346, 119, - /* 1430 */ - 224, 232, 348, 119, 235, 351, 242, 119, 252, 255, - /* 1440 */ - 118, 261, 264, 267, 134, 274, 276, 282, 282, 164, - /* 1450 */ - 166, 119, 174, 26, 234, 119, 181, 39, 169, 171, - /* 1460 */ - 119, 119, 180, 119, 187, 190, 192, 119, 188, 199, - /* 1470 */ - 201, 282, 203, 215, 205, 282, 282, 282, 282, 119, - /* 1480 */ - 119, 119, 224, 119, 282, 119, 235, 240, 242, 282, - /* 1490 */ - 252, 255, 207, 261, 264, 267, 209, 274, 276, 282, - /* 1500 */ - 282, 225, 253, 119, 256, 26, 234, 119, 259, 39, - /* 1510 */ - 169, 171, 119, 119, 180, 119, 187, 190, 192, 119, - /* 1520 */ - 262, 265, 279, 282, 328, 215, 335, 282, 282, 282, - /* 1530 */ - 282, 119, 119, 119, 224, 119, 282, 119, 235, 282, - /* 1540 */ - 242, 282, 252, 255, 282, 261, 264, 267, 272, 274, - /* 1550 */ - 276, 282, 282, 282, 282, 282, 282, 26, 234, 282, - /* 1560 */ - 282, 39, 169, 171, 282, 282, 180, 282, 187, 190, - /* 1570 */ - 192, 282, 282, 282, 282, 282, 282, 215, 282, 282, - /* 1580 */ - 282, 282, 282, 282, 282, 282, 224, 282, 282, 282, - /* 1590 */ - 235, 282, 242, 282, 252, 255, 282, 261, 264, 267, - /* 1600 */ - 286, 274, 276, 282, 282, 282, 282, 282, 282, 26, - /* 1610 */ - 234, 282, 282, 39, 169, 171, 282, 282, 180, 282, - /* 1620 */ - 187, 190, 192, 282, 282, 282, 282, 282, 282, 215, - /* 1630 */ - 282, 282, 282, 282, 282, 282, 282, 282, 224, 282, - /* 1640 */ - 282, 282, 235, 289, 242, 282, 252, 255, 282, 261, - /* 1650 */ - 264, 267, 282, 274, 276, 282, 282, 282, 282, 282, - /* 1660 */ - 282, 26, 234, 282, 282, 39, 169, 171, 282, 282, - /* 1670 */ - 180, 282, 187, 190, 192, 282, 282, 282, 282, 282, - /* 1680 */ - 282, 215, 282, 301, 282, 282, 282, 282, 282, 282, - /* 1690 */ - 224, 282, 282, 282, 235, 282, 242, 282, 252, 255, - /* 1700 */ - 282, 261, 264, 267, 282, 274, 276, 282, 282, 282, - /* 1710 */ - 282, 282, 282, 26, 234, 282, 282, 39, 169, 171, - /* 1720 */ - 282, 282, 180, 316, 187, 190, 192, 282, 282, 282, - /* 1730 */ - 282, 282, 282, 215, 282, 282, 282, 282, 282, 282, - /* 1740 */ - 282, 282, 224, 282, 282, 282, 235, 282, 242, 282, - /* 1750 */ - 252, 255, 282, 261, 264, 267, 282, 274, 276, 282, - /* 1760 */ - 282, 282, 282, 282, 282, 26, 234, 282, 282, 39, - /* 1770 */ - 169, 171, 282, 323, 180, 282, 187, 190, 192, 282, - /* 1780 */ - 282, 282, 282, 282, 282, 215, 282, 282, 282, 282, - /* 1790 */ - 282, 282, 282, 282, 224, 282, 282, 282, 235, 282, - /* 1800 */ - 242, 282, 252, 255, 282, 261, 264, 267, 282, 274, - /* 1810 */ - 276, 282, 282, 282, 282, 282, 282, 26, 234, 282, - /* 1820 */ - 282, 39, 169, 171, 282, 332, 180, 282, 187, 190, - /* 1830 */ - 192, 282, 282, 282, 282, 282, 282, 215, 282, 282, - /* 1840 */ - 282, 282, 282, 282, 282, 282, 224, 282, 282, 282, - /* 1850 */ - 235, 282, 242, 282, 252, 255, 282, 261, 264, 267, - /* 1860 */ - 282, 274, 276, 282, 282, 282, 282, 282, 282, 26, - /* 1870 */ - 234, 282, 282, 39, 169, 171, 282, 339, 180, 282, - /* 1880 */ - 187, 190, 192, 282, 282, 282, 282, 282, 282, 215, - /* 1890 */ - 282, 282, 282, 282, 282, 282, 282, 282, 224, 282, - /* 1900 */ - 282, 282, 235, 282, 242, 282, 252, 255, 282, 261, - /* 1910 */ - 264, 267, 282, 274, 276, 282, 282, 282, 282, 282, - /* 1920 */ - 282, 26, 234, 342, 282, 39, 169, 171, 282, 282, - /* 1930 */ - 180, 282, 187, 190, 192, 282, 282, 282, 282, 282, - /* 1940 */ - 282, 215, 282, 282, 282, 282, 282, 282, 282, 282, - /* 1950 */ - 224, 282, 282, 282, 235, 282, 242, 282, 252, 255, - /* 1960 */ - 282, 261, 264, 267, 282, 274, 276, 282, 282, 282, - /* 1970 */ - 282, 282, 282, 26, 234, 282, 282, 39, 169, 171, - /* 1980 */ - 282, 282, 180, 282, 187, 190, 192, 46, 43, 282, - /* 1990 */ - 105, 282, 100, 215, 282, 102, 282, 282, 282, 282, - /* 2000 */ - 282, 282, 224, 282, 120, 282, 235, 282, 242, 282, - /* 2010 */ - 252, 255, 282, 261, 264, 267, 282, 274, 276, 282, - /* 2020 */ - 121, 122, 123, 124, 125, 126, 46, 43, 282, 105, - /* 2030 */ - 282, 100, 282, 282, 102, 282, 282, 282, 282, 282, - /* 2040 */ - 282, 282, 282, 120, 156, 157, 158, 159, 160, 161, - /* 2050 */ - 162, 111, 282, 282, 282, 282, 282, 282, 282, 121, - /* 2060 */ - 122, 123, 124, 125, 126, 282, 282, 282, 282, 282, - /* 2070 */ - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - /* 2080 */ - 282, 282, 282, 149, 150, 151, 152, 153, 154, 155, - /* 2090 */ - 111, 282, 282, 282, 282, 282, 282, 282, 282, 282, - /* 2100 */ - 282, 282, 282, 165, 282, 46, 43, 282, 105, 282, - /* 2110 */ - 100, 282, 282, 102, 282, 282, 282, 282, 282, 282, - /* 2120 */ - 282, 282, 120, 282, 163, 282, 282, 46, 43, 282, - /* 2130 */ - 105, 282, 100, 137, 282, 102, 282, 282, 121, 122, - /* 2140 */ - 123, 124, 125, 126, 120, 282, 282, 282, 282, 282, - /* 2150 */ - 46, 43, 282, 105, 282, 100, 282, 282, 102, 282, - /* 2160 */ - 121, 122, 123, 124, 125, 126, 282, 148, 282, 111, - /* 2170 */ - 282, 282, 46, 43, 282, 105, 282, 100, 282, 282, - /* 2180 */ - 102, 282, 282, 147, 122, 123, 124, 125, 126, 120, - /* 2190 */ - 282, 111, 282, 282, 46, 43, 282, 105, 282, 100, - /* 2200 */ - 282, 282, 102, 135, 282, 121, 132, 123, 124, 125, - /* 2210 */ - 126, 120, 282, 282, 111, 282, 46, 43, 282, 105, - /* 2220 */ - 282, 100, 282, 107, 102, 282, 282, 121, 116, 123, - /* 2230 */ - 124, 125, 126, 120, 282, 282, 111, 282, 46, 43, - /* 2240 */ - 282, 105, 282, 100, 282, 282, 102, 282, 282, 121, - /* 2250 */ - 116, 123, 124, 125, 126, 120, 282, 282, 111, 282, - /* 2260 */ - 46, 43, 282, 105, 282, 100, 282, 282, 102, 291, - /* 2270 */ - 282, 121, 132, 123, 124, 125, 126, 120, 282, 282, - /* 2280 */ - 111, 112, 46, 43, 282, 105, 282, 100, 282, 282, - /* 2290 */ - 102, 282, 282, 121, 122, 123, 124, 125, 126, 120, - /* 2300 */ - 282, 282, 111, 282, 46, 43, 282, 105, 282, 100, - /* 2310 */ - 282, 282, 102, 282, 282, 121, 116, 123, 124, 125, - /* 2320 */ - 126, 120, 282, 282, 111, 282, 282, 282, 282, 282, - /* 2330 */ - 282, 282, 282, 282, 282, 282, 282, 121, 132, 123, - /* 2340 */ - 124, 125, 126, 282, 282, 282, 111, 282, 282, 282, - /* 2350 */ - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - /* 2360 */ - 282, 282, 282, 282, 282, 282, 282, 282, 111, - ); - static $yy_lookahead = array( - /* 0 */ - 3, 2, 5, 6, 7, 8, 9, 10, 11, 12, - /* 10 */ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - /* 20 */ - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - /* 30 */ - 3, 32, 5, 6, 7, 8, 9, 10, 11, 12, - /* 40 */ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - /* 50 */ - 23, 24, 25, 26, 27, 28, 29, 30, 3, 32, - /* 60 */ - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - /* 70 */ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - /* 80 */ - 25, 26, 27, 28, 29, 30, 31, 32, 24, 25, - /* 90 */ - 26, 27, 28, 29, 30, 0, 2, 70, 114, 115, - /* 100 */ - 116, 3, 8, 5, 6, 7, 8, 9, 10, 11, - /* 110 */ - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - /* 120 */ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 3, - /* 130 */ - 32, 5, 6, 7, 8, 9, 10, 11, 12, 13, - /* 140 */ - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - /* 150 */ - 24, 25, 26, 27, 28, 29, 30, 3, 32, 5, - /* 160 */ - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - /* 170 */ - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - /* 180 */ - 26, 27, 28, 29, 30, 18, 19, 20, 21, 22, - /* 190 */ - 23, 24, 25, 26, 27, 28, 29, 30, 54, 55, - /* 200 */ - 56, 57, 58, 59, 50, 115, 116, 1, 3, 4, - /* 210 */ - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - /* 220 */ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - /* 230 */ - 25, 26, 27, 28, 29, 30, 3, 2, 5, 6, - /* 240 */ - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - /* 250 */ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - /* 260 */ - 27, 28, 29, 30, 21, 22, 23, 24, 25, 26, - /* 270 */ - 27, 28, 29, 30, 26, 27, 28, 29, 30, 113, - /* 280 */ - 117, 118, 32, 77, 32, 52, 32, 52, 122, 3, - /* 290 */ - 124, 5, 6, 7, 8, 9, 10, 11, 12, 13, - /* 300 */ - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - /* 310 */ - 24, 25, 26, 27, 28, 29, 30, 3, 32, 5, - /* 320 */ - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - /* 330 */ - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - /* 340 */ - 26, 27, 28, 29, 30, 3, 32, 5, 6, 7, - /* 350 */ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - /* 360 */ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - /* 370 */ - 28, 29, 30, 113, 58, 59, 113, 8, 113, 113, - /* 380 */ - 120, 38, 4, 113, 124, 125, 121, 124, 123, 124, - /* 390 */ - 124, 121, 50, 123, 124, 4, 3, 54, 5, 6, - /* 400 */ - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - /* 410 */ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - /* 420 */ - 27, 28, 29, 30, 3, 32, 5, 6, 7, 8, - /* 430 */ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - /* 440 */ - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - /* 450 */ - 29, 30, 3, 32, 5, 6, 7, 8, 9, 10, - /* 460 */ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - /* 470 */ - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - /* 480 */ - 3, 32, 5, 6, 7, 8, 9, 10, 11, 12, - /* 490 */ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - /* 500 */ - 23, 24, 25, 26, 27, 28, 29, 30, 3, 32, - /* 510 */ - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - /* 520 */ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - /* 530 */ - 25, 26, 27, 28, 29, 30, 3, 122, 5, 6, - /* 540 */ - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - /* 550 */ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - /* 560 */ - 27, 28, 29, 30, 50, 32, 50, 3, 63, 5, - /* 570 */ - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - /* 580 */ - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - /* 590 */ - 26, 27, 28, 29, 30, 3, 32, 5, 6, 7, - /* 600 */ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - /* 610 */ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - /* 620 */ - 28, 29, 30, 3, 50, 5, 6, 7, 8, 9, - /* 630 */ - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - /* 640 */ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - /* 650 */ - 30, 5, 6, 7, 8, 9, 10, 11, 12, 13, - /* 660 */ - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - /* 670 */ - 24, 25, 26, 27, 28, 29, 30, 88, 89, 90, - /* 680 */ - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - /* 690 */ - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - /* 700 */ - 111, 112, 6, 7, 8, 9, 10, 11, 12, 13, - /* 710 */ - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - /* 720 */ - 24, 25, 26, 27, 28, 29, 30, 90, 91, 92, - /* 730 */ - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - /* 740 */ - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - /* 750 */ - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - /* 760 */ - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - /* 770 */ - 110, 111, 112, 8, 9, 10, 11, 12, 13, 14, - /* 780 */ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - /* 790 */ - 25, 26, 27, 28, 29, 30, 90, 91, 92, 93, - /* 800 */ - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - /* 810 */ - 104, 105, 106, 107, 108, 109, 110, 111, 112, 90, - /* 820 */ - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - /* 830 */ - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - /* 840 */ - 111, 112, 90, 91, 92, 93, 94, 95, 96, 97, - /* 850 */ - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - /* 860 */ - 108, 109, 110, 111, 112, 90, 91, 92, 93, 94, - /* 870 */ - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - /* 880 */ - 105, 106, 107, 108, 109, 110, 111, 112, 90, 91, - /* 890 */ - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - /* 900 */ - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - /* 910 */ - 112, 90, 91, 92, 93, 94, 95, 96, 97, 98, - /* 920 */ - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - /* 930 */ - 109, 110, 111, 112, 90, 91, 92, 93, 94, 95, - /* 940 */ - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - /* 950 */ - 106, 107, 108, 109, 110, 111, 112, 90, 91, 92, - /* 960 */ - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - /* 970 */ - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - /* 980 */ - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - /* 990 */ - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - /* 1000 */ - 110, 111, 112, 90, 91, 92, 93, 94, 95, 96, - /* 1010 */ - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - /* 1020 */ - 107, 108, 109, 110, 111, 112, 90, 91, 92, 93, - /* 1030 */ - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - /* 1040 */ - 104, 105, 106, 107, 108, 109, 110, 111, 112, 91, - /* 1050 */ - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - /* 1060 */ - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - /* 1070 */ - 112, 31, 32, 33, 34, 35, 36, 37, 0, 1, - /* 1080 */ - 40, 113, 42, 43, 44, 113, 38, 122, 120, 4, - /* 1090 */ - 4, 51, 124, 125, 113, 1, 124, 1, 50, 1, - /* 1100 */ - 60, 1, 54, 113, 64, 124, 66, 50, 68, 69, - /* 1110 */ - 4, 71, 72, 73, 124, 75, 76, 2, 9, 10, - /* 1120 */ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - /* 1130 */ - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - /* 1140 */ - 62, 31, 32, 33, 34, 35, 36, 37, 1, 1, - /* 1150 */ - 40, 1, 42, 43, 44, 77, 62, 113, 62, 32, - /* 1160 */ - 62, 51, 62, 38, 32, 50, 24, 123, 124, 113, - /* 1170 */ - 60, 77, 30, 77, 64, 77, 66, 77, 68, 69, - /* 1180 */ - 124, 71, 72, 73, 2, 75, 76, 45, 46, 47, - /* 1190 */ - 48, 49, 2, 31, 32, 33, 113, 35, 36, 37, - /* 1200 */ - 1, 1, 40, 1, 42, 43, 44, 124, 125, 62, - /* 1210 */ - 62, 32, 62, 51, 38, 32, 38, 116, 113, 32, - /* 1220 */ - 29, 2, 60, 38, 77, 77, 64, 77, 66, 124, - /* 1230 */ - 68, 69, 113, 71, 72, 73, 113, 75, 76, 1, - /* 1240 */ - 32, 32, 52, 124, 32, 31, 32, 124, 113, 35, - /* 1250 */ - 36, 37, 1, 39, 40, 1, 42, 43, 44, 124, - /* 1260 */ - 1, 62, 62, 32, 62, 51, 32, 38, 86, 32, - /* 1270 */ - 113, 52, 92, 67, 60, 32, 77, 77, 64, 77, - /* 1280 */ - 66, 124, 68, 69, 113, 71, 72, 73, 113, 75, - /* 1290 */ - 76, 1, 67, 1, 32, 124, 32, 31, 32, 124, - /* 1300 */ - 62, 35, 36, 37, 1, 1, 40, 41, 42, 43, - /* 1310 */ - 44, 113, 1, 62, 113, 77, 62, 51, 113, 38, - /* 1320 */ - 32, 62, 124, 1, 61, 124, 60, 32, 77, 124, - /* 1330 */ - 64, 77, 66, 52, 68, 69, 77, 71, 72, 73, - /* 1340 */ - 113, 75, 76, 45, 32, 113, 113, 32, 113, 31, - /* 1350 */ - 32, 124, 62, 35, 36, 37, 124, 124, 40, 124, - /* 1360 */ - 42, 43, 44, 113, 32, 62, 62, 77, 113, 51, - /* 1370 */ - 32, 53, 32, 62, 124, 118, 32, 32, 60, 124, - /* 1380 */ - 77, 77, 64, 32, 66, 113, 68, 69, 77, 71, - /* 1390 */ - 72, 73, 113, 75, 76, 32, 124, 113, 113, 119, - /* 1400 */ - 113, 31, 32, 124, 113, 35, 36, 37, 124, 124, - /* 1410 */ - 40, 124, 42, 43, 44, 124, 32, 32, 113, 38, - /* 1420 */ - 8, 51, 113, 33, 32, 32, 113, 1, 32, 124, - /* 1430 */ - 60, 61, 32, 124, 64, 32, 66, 124, 68, 69, - /* 1440 */ - 113, 71, 72, 73, 113, 75, 76, 126, 126, 113, - /* 1450 */ - 113, 124, 113, 31, 32, 124, 113, 35, 36, 37, - /* 1460 */ - 124, 124, 40, 124, 42, 43, 44, 124, 113, 113, - /* 1470 */ - 113, 126, 113, 51, 113, 126, 126, 126, 126, 124, - /* 1480 */ - 124, 124, 60, 124, 126, 124, 64, 65, 66, 126, - /* 1490 */ - 68, 69, 113, 71, 72, 73, 113, 75, 76, 126, - /* 1500 */ - 126, 113, 113, 124, 113, 31, 32, 124, 113, 35, - /* 1510 */ - 36, 37, 124, 124, 40, 124, 42, 43, 44, 124, - /* 1520 */ - 113, 113, 113, 126, 113, 51, 113, 126, 126, 126, - /* 1530 */ - 126, 124, 124, 124, 60, 124, 126, 124, 64, 126, - /* 1540 */ - 66, 126, 68, 69, 126, 71, 72, 73, 74, 75, - /* 1550 */ - 76, 126, 126, 126, 126, 126, 126, 31, 32, 126, - /* 1560 */ - 126, 35, 36, 37, 126, 126, 40, 126, 42, 43, - /* 1570 */ - 44, 126, 126, 126, 126, 126, 126, 51, 126, 126, - /* 1580 */ - 126, 126, 126, 126, 126, 126, 60, 126, 126, 126, - /* 1590 */ - 64, 126, 66, 126, 68, 69, 126, 71, 72, 73, - /* 1600 */ - 74, 75, 76, 126, 126, 126, 126, 126, 126, 31, - /* 1610 */ - 32, 126, 126, 35, 36, 37, 126, 126, 40, 126, - /* 1620 */ - 42, 43, 44, 126, 126, 126, 126, 126, 126, 51, - /* 1630 */ - 126, 126, 126, 126, 126, 126, 126, 126, 60, 126, - /* 1640 */ - 126, 126, 64, 65, 66, 126, 68, 69, 126, 71, - /* 1650 */ - 72, 73, 126, 75, 76, 126, 126, 126, 126, 126, - /* 1660 */ - 126, 31, 32, 126, 126, 35, 36, 37, 126, 126, - /* 1670 */ - 40, 126, 42, 43, 44, 126, 126, 126, 126, 126, - /* 1680 */ - 126, 51, 126, 53, 126, 126, 126, 126, 126, 126, - /* 1690 */ - 60, 126, 126, 126, 64, 126, 66, 126, 68, 69, - /* 1700 */ - 126, 71, 72, 73, 126, 75, 76, 126, 126, 126, - /* 1710 */ - 126, 126, 126, 31, 32, 126, 126, 35, 36, 37, - /* 1720 */ - 126, 126, 40, 41, 42, 43, 44, 126, 126, 126, - /* 1730 */ - 126, 126, 126, 51, 126, 126, 126, 126, 126, 126, - /* 1740 */ - 126, 126, 60, 126, 126, 126, 64, 126, 66, 126, - /* 1750 */ - 68, 69, 126, 71, 72, 73, 126, 75, 76, 126, - /* 1760 */ - 126, 126, 126, 126, 126, 31, 32, 126, 126, 35, - /* 1770 */ - 36, 37, 126, 39, 40, 126, 42, 43, 44, 126, - /* 1780 */ - 126, 126, 126, 126, 126, 51, 126, 126, 126, 126, - /* 1790 */ - 126, 126, 126, 126, 60, 126, 126, 126, 64, 126, - /* 1800 */ - 66, 126, 68, 69, 126, 71, 72, 73, 126, 75, - /* 1810 */ - 76, 126, 126, 126, 126, 126, 126, 31, 32, 126, - /* 1820 */ - 126, 35, 36, 37, 126, 39, 40, 126, 42, 43, - /* 1830 */ - 44, 126, 126, 126, 126, 126, 126, 51, 126, 126, - /* 1840 */ - 126, 126, 126, 126, 126, 126, 60, 126, 126, 126, - /* 1850 */ - 64, 126, 66, 126, 68, 69, 126, 71, 72, 73, - /* 1860 */ - 126, 75, 76, 126, 126, 126, 126, 126, 126, 31, - /* 1870 */ - 32, 126, 126, 35, 36, 37, 126, 39, 40, 126, - /* 1880 */ - 42, 43, 44, 126, 126, 126, 126, 126, 126, 51, - /* 1890 */ - 126, 126, 126, 126, 126, 126, 126, 126, 60, 126, - /* 1900 */ - 126, 126, 64, 126, 66, 126, 68, 69, 126, 71, - /* 1910 */ - 72, 73, 126, 75, 76, 126, 126, 126, 126, 126, - /* 1920 */ - 126, 31, 32, 33, 126, 35, 36, 37, 126, 126, - /* 1930 */ - 40, 126, 42, 43, 44, 126, 126, 126, 126, 126, - /* 1940 */ - 126, 51, 126, 126, 126, 126, 126, 126, 126, 126, - /* 1950 */ - 60, 126, 126, 126, 64, 126, 66, 126, 68, 69, - /* 1960 */ - 126, 71, 72, 73, 126, 75, 76, 126, 126, 126, - /* 1970 */ - 126, 126, 126, 31, 32, 126, 126, 35, 36, 37, - /* 1980 */ - 126, 126, 40, 126, 42, 43, 44, 21, 22, 126, - /* 1990 */ - 24, 126, 26, 51, 126, 29, 126, 126, 126, 126, - /* 2000 */ - 126, 126, 60, 126, 38, 126, 64, 126, 66, 126, - /* 2010 */ - 68, 69, 126, 71, 72, 73, 126, 75, 76, 126, - /* 2020 */ - 54, 55, 56, 57, 58, 59, 21, 22, 126, 24, - /* 2030 */ - 126, 26, 126, 126, 29, 126, 126, 126, 126, 126, - /* 2040 */ - 126, 126, 126, 38, 78, 79, 80, 81, 82, 83, - /* 2050 */ - 84, 85, 126, 126, 126, 126, 126, 126, 126, 54, - /* 2060 */ - 55, 56, 57, 58, 59, 126, 126, 126, 126, 126, - /* 2070 */ - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - /* 2080 */ - 126, 126, 126, 78, 79, 80, 81, 82, 83, 84, - /* 2090 */ - 85, 126, 126, 126, 126, 126, 126, 126, 126, 126, - /* 2100 */ - 126, 126, 126, 19, 126, 21, 22, 126, 24, 126, - /* 2110 */ - 26, 126, 126, 29, 126, 126, 126, 126, 126, 126, - /* 2120 */ - 126, 126, 38, 126, 18, 126, 126, 21, 22, 126, - /* 2130 */ - 24, 126, 26, 4, 126, 29, 126, 126, 54, 55, - /* 2140 */ - 56, 57, 58, 59, 38, 126, 126, 126, 126, 126, - /* 2150 */ - 21, 22, 126, 24, 126, 26, 126, 126, 29, 126, - /* 2160 */ - 54, 55, 56, 57, 58, 59, 126, 38, 126, 85, - /* 2170 */ - 126, 126, 21, 22, 126, 24, 126, 26, 126, 126, - /* 2180 */ - 29, 126, 126, 54, 55, 56, 57, 58, 59, 38, - /* 2190 */ - 126, 85, 126, 126, 21, 22, 126, 24, 126, 26, - /* 2200 */ - 126, 126, 29, 52, 126, 54, 55, 56, 57, 58, - /* 2210 */ - 59, 38, 126, 126, 85, 126, 21, 22, 126, 24, - /* 2220 */ - 126, 26, 126, 50, 29, 126, 126, 54, 55, 56, - /* 2230 */ - 57, 58, 59, 38, 126, 126, 85, 126, 21, 22, - /* 2240 */ - 126, 24, 126, 26, 126, 126, 29, 126, 126, 54, - /* 2250 */ - 55, 56, 57, 58, 59, 38, 126, 126, 85, 126, - /* 2260 */ - 21, 22, 126, 24, 126, 26, 126, 126, 29, 52, - /* 2270 */ - 126, 54, 55, 56, 57, 58, 59, 38, 126, 126, - /* 2280 */ - 85, 86, 21, 22, 126, 24, 126, 26, 126, 126, - /* 2290 */ - 29, 126, 126, 54, 55, 56, 57, 58, 59, 38, - /* 2300 */ - 126, 126, 85, 126, 21, 22, 126, 24, 126, 26, - /* 2310 */ - 126, 126, 29, 126, 126, 54, 55, 56, 57, 58, - /* 2320 */ - 59, 38, 126, 126, 85, 126, 126, 126, 126, 126, - /* 2330 */ - 126, 126, 126, 126, 126, 126, 126, 54, 55, 56, - /* 2340 */ - 57, 58, 59, 126, 126, 126, 85, 126, 126, 126, - /* 2350 */ - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - /* 2360 */ - 126, 126, 126, 126, 126, 126, 126, 126, 85, - ); - const YY_SHIFT_USE_DFLT = -4; - const YY_SHIFT_MAX = 351; - static $yy_shift_ofst = array( - /* 0 */ - 1094, 95, 1078, -4, -4, -4, -4, -4, -4, -4, - /* 10 */ - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - /* 20 */ - -4, -4, -4, -4, -4, 1942, 2239, 98, 1096, 1098, - /* 30 */ - 1040, 250, -4, 252, 1100, 1147, 1162, 254, -4, 2239, - /* 40 */ - 126, -4, 2239, 2239, 64, 2239, 2239, 64, 2084, 243, - /* 50 */ - 2106, 243, 2239, 243, 2239, 765, 2239, 765, 2239, 64, - /* 60 */ - 2239, 248, 2239, 696, 2239, 167, 1966, 167, 2005, 167, - /* 70 */ - 2239, 167, 2239, 167, 2239, 167, 2239, 167, 2239, 167, - /* 80 */ - 2239, 167, 2239, -4, 2239, 1109, 369, 2239, 248, -4, - /* 90 */ - -4, 2129, 154, -4, 2239, 205, 2239, 646, 2151, 592, - /* 100 */ - 2239, 248, 2239, 233, -4, 2173, 592, -4, 1115, -4, - /* 110 */ - 2261, 2195, -4, 1182, -4, -4, 378, 2239, 592, -4, - /* 120 */ - -4, -4, -4, -4, -4, -4, -4, -4, 235, -4, - /* 130 */ - 2283, -4, 391, 2239, 592, -4, -4, 343, 514, -4, - /* 140 */ - 516, 574, 1085, 1048, -4, 1057, -4, 1086, 1106, -4, - /* 150 */ - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - /* 160 */ - -4, -4, -4, 2239, 243, 2239, 243, 64, 64, 1127, - /* 170 */ - -4, 1125, 94, 2239, -3, 1094, 1148, 1214, 1132, -4, - /* 180 */ - 2239, 286, 1150, 1199, 1266, 1179, -4, 2239, 314, -4, - /* 190 */ - 1183, -4, 1176, -1, -4, 1176, -4, 1142, 2239, 592, - /* 200 */ - 2239, 592, 2239, 592, 2239, 592, 2239, 592, 2239, 342, - /* 210 */ - -4, 1176, -4, -4, -4, 1178, 1191, 1281, 1187, 1094, - /* 220 */ - 1200, 1318, 1208, -4, 2239, 620, 2217, 1190, 1209, 1094, - /* 230 */ - 1202, 1370, 1212, -4, -4, 1185, 1231, 1238, 1251, 1422, - /* 240 */ - 1234, -4, 1237, 206, 1292, 1206, 1243, -4, 1225, 1262, - /* 250 */ - -4, -4, 2239, 393, -4, 2239, 27, -4, 2239, 421, - /* 260 */ - -4, 2239, 449, -4, 2239, 477, -4, 316, 1264, 1094, - /* 270 */ - 1254, 1474, 1288, -4, 1295, -4, 1312, -4, 2239, 505, - /* 280 */ - -4, -4, 1315, 1094, 1259, 1526, 1332, -4, 1578, 1338, - /* 290 */ - -4, 1340, 1322, 1263, 1345, -4, 1219, 1351, 1094, 1290, - /* 300 */ - 1630, 1363, -4, 1229, -4, 1298, 144, -4, -4, -4, - /* 310 */ - -4, -4, -4, -4, -4, 1682, 1344, -4, 2239, 533, - /* 320 */ - 1094, 1303, 1734, 1384, -4, 1381, 1412, 2239, 55, 1094, - /* 330 */ - 1304, 1786, 1385, -4, 2239, 564, 1094, 1311, 1838, 1392, - /* 340 */ - -4, 1890, 1393, -4, 1110, 1396, -4, 1400, 1426, 1390, - /* 350 */ - 1403, -4, - ); - const YY_REDUCE_USE_DFLT = -17; - const YY_REDUCE_MAX = 351; - static $yy_reduce_ofst = array( - /* 0 */ - 589, -17, 958, -17, -17, -17, -17, -17, -17, -17, - /* 10 */ - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - /* 20 */ - -17, -17, -17, -17, -17, -17, 263, -17, 637, 958, - /* 30 */ - -17, -17, -17, -17, 660, 958, -17, -17, -17, 266, - /* 40 */ - -17, -17, 972, 981, -17, 990, 1056, -17, 1105, -17, - /* 50 */ - 1119, -17, 1123, -17, 1135, -17, 1157, -17, 1171, -17, - /* 60 */ - 1175, -17, 1198, -17, 1201, -17, 1205, -17, 1227, -17, - /* 70 */ - 1232, -17, 1233, -17, 1235, -17, 1250, -17, 1255, -17, - /* 80 */ - 1279, -17, 1284, -17, 1285, -17, -17, 1287, -17, -17, - /* 90 */ - -17, 166, -17, -17, 1291, -17, 1305, -17, 260, -17, - /* 100 */ - 1309, -17, 1313, -17, -17, 265, -17, -17, -17, -17, - /* 110 */ - 1044, 270, -17, -17, -17, -17, -17, 1327, -17, -17, - /* 120 */ - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - /* 130 */ - 1083, -17, -17, 1331, -17, -17, -17, 415, -17, -17, - /* 140 */ - -17, -17, -17, 965, -17, -17, -17, -17, -17, -17, - /* 150 */ - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - /* 160 */ - -17, -17, -17, 1336, -17, 1337, -17, -17, -17, -17, - /* 170 */ - -17, -17, -17, 1339, -17, 706, 958, -17, -17, -17, - /* 180 */ - 1343, -17, 729, 958, -17, -17, -17, 1355, -17, -17, - /* 190 */ - -17, -17, -16, -17, -17, 90, -17, -17, 1356, -17, - /* 200 */ - 1357, -17, 1359, -17, 1361, -17, 1379, -17, 1383, -17, - /* 210 */ - -17, 1101, -17, -17, -17, -17, -17, 163, -17, 752, - /* 220 */ - 958, -17, -17, -17, 1388, -17, 968, -17, -17, 775, - /* 230 */ - 958, -17, -17, -17, -17, -17, -17, 798, 958, -17, - /* 240 */ - -17, -17, -17, 1180, -17, -17, -17, -17, -17, -17, - /* 250 */ - -17, -17, 1389, -17, -17, 1391, -17, -17, 1395, -17, - /* 260 */ - -17, 1407, -17, -17, 1408, -17, -17, -17, -17, 821, - /* 270 */ - 958, -17, -17, -17, -17, -17, -17, -17, 1409, -17, - /* 280 */ - -17, -17, -17, 844, 958, -17, -17, -17, -17, -17, - /* 290 */ - -17, -17, -17, -17, -17, -17, -17, -17, 867, 958, - /* 300 */ - -17, -17, -17, 1257, -17, -17, 1280, -17, -17, -17, - /* 310 */ - -17, -17, -17, -17, -17, -17, -17, -17, 1272, -17, - /* 320 */ - 890, 958, -17, -17, -17, -17, -17, 1411, -17, 913, - /* 330 */ - 958, -17, -17, -17, 1413, -17, 936, 958, -17, -17, - /* 340 */ - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - /* 350 */ - -17, -17, - ); - static $yy_default = array( - /* 0 */ - 506, 506, 506, 354, 356, 357, 358, 359, 360, 361, - /* 10 */ - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - /* 20 */ - 372, 373, 374, 375, 376, 506, 506, 506, 506, 506, - /* 30 */ - 506, 506, 377, 506, 506, 506, 506, 506, 379, 506, - /* 40 */ - 506, 382, 506, 506, 433, 506, 506, 434, 506, 437, - /* 50 */ - 506, 439, 506, 441, 506, 442, 506, 443, 506, 444, - /* 60 */ - 506, 445, 506, 446, 506, 447, 506, 463, 506, 462, - /* 70 */ - 506, 464, 506, 465, 506, 466, 506, 467, 506, 468, - /* 80 */ - 506, 469, 506, 470, 506, 471, 506, 506, 472, 474, - /* 90 */ - 475, 506, 506, 481, 506, 506, 506, 482, 506, 497, - /* 100 */ - 506, 473, 506, 506, 476, 506, 491, 477, 506, 478, - /* 110 */ - 506, 506, 479, 506, 480, 489, 501, 506, 490, 492, - /* 120 */ - 499, 500, 501, 502, 503, 504, 505, 488, 506, 493, - /* 130 */ - 506, 495, 501, 506, 498, 494, 496, 506, 506, 483, - /* 140 */ - 506, 506, 506, 506, 484, 506, 485, 500, 499, 449, - /* 150 */ - 451, 453, 455, 457, 459, 461, 448, 450, 452, 454, - /* 160 */ - 456, 458, 460, 506, 440, 506, 438, 436, 435, 506, - /* 170 */ - 383, 506, 506, 506, 506, 506, 506, 506, 506, 384, - /* 180 */ - 506, 506, 506, 506, 506, 506, 388, 506, 506, 390, - /* 190 */ - 506, 391, 506, 506, 392, 506, 393, 506, 506, 395, - /* 200 */ - 506, 396, 506, 397, 506, 398, 506, 399, 506, 506, - /* 210 */ - 401, 506, 400, 402, 394, 506, 506, 506, 506, 506, - /* 220 */ - 506, 506, 506, 403, 506, 506, 506, 506, 493, 506, - /* 230 */ - 506, 506, 506, 415, 417, 506, 506, 506, 506, 506, - /* 240 */ - 506, 419, 506, 506, 506, 506, 506, 421, 506, 506, - /* 250 */ - 422, 432, 506, 506, 423, 506, 506, 424, 506, 506, - /* 260 */ - 425, 506, 506, 426, 506, 506, 427, 506, 506, 506, - /* 270 */ - 506, 506, 506, 428, 506, 430, 506, 431, 506, 506, - /* 280 */ - 418, 355, 506, 506, 506, 506, 506, 429, 506, 506, - /* 290 */ - 420, 494, 506, 506, 506, 416, 506, 506, 506, 506, - /* 300 */ - 506, 506, 404, 506, 405, 407, 506, 408, 409, 410, - /* 310 */ - 411, 412, 413, 414, 406, 506, 506, 389, 506, 506, - /* 320 */ - 506, 506, 506, 506, 385, 506, 506, 506, 506, 506, - /* 330 */ - 506, 506, 506, 386, 506, 506, 506, 506, 506, 506, - /* 340 */ - 387, 506, 506, 380, 506, 506, 378, 506, 506, 506, - /* 350 */ - 506, 381, - ); - - /* The next table maps tokens into fallback tokens. If a construct -** like the following: -** -** %fallback ID X Y Z. -** -** appears in the grammer, then ID becomes a fallback token for X, Y, -** and Z. Whenever one of the tokens X, Y, or Z is input to the parser -** but it does not parse, the type of the token is changed to ID and -** the parse is retried before an error is thrown. -*/ - static $yyFallback = array(); - - /* -** Turn parser tracing on by giving a stream to which to write the trace -** and a prompt to preface each trace message. Tracing is turned off -** by making either argument NULL -** -** Inputs: -** -** -** Outputs: -** None. -*/ - function phvolt_Trace(/* stream */ $TraceFILE, string $zTracePrompt = '') - { - $this->yyTraceFILE = $TraceFILE; - $this->yyTracePrompt = $zTracePrompt; - if ($this->yyTraceFILE === null) { - $this->yyTracePrompt = null; - } elseif ($this->yyTracePrompt === null) { - $this->yyTraceFILE = null; - } - } - - /* For tracing shifts, the names of all terminals and nonterminals -** are required. The following table supplies these names */ - static $yyTokenName = array( - '$', 'OPEN_DELIMITER', 'COMMA', 'QUESTION', - 'COLON', 'RANGE', 'AND', 'OR', - 'IN', 'IS', 'EQUALS', 'NOTEQUALS', - 'LESS', 'GREATER', 'GREATEREQUAL', 'LESSEQUAL', - 'IDENTICAL', 'NOTIDENTICAL', 'DIVIDE', 'TIMES', - 'MOD', 'PLUS', 'MINUS', 'CONCAT', - 'SBRACKET_OPEN', 'PIPE', 'NOT', 'INCR', - 'DECR', 'PARENTHESES_OPEN', 'DOT', 'IF', - 'CLOSE_DELIMITER', 'ENDIF', 'ELSE', 'ELSEIF', - 'ELSEFOR', 'FOR', 'IDENTIFIER', 'ENDFOR', - 'SWITCH', 'ENDSWITCH', 'CASE', 'DEFAULT', - 'SET', 'ASSIGN', 'ADD_ASSIGN', 'SUB_ASSIGN', - 'MUL_ASSIGN', 'DIV_ASSIGN', 'SBRACKET_CLOSE', 'MACRO', - 'PARENTHESES_CLOSE', 'ENDMACRO', 'INTEGER', 'STRING', - 'DOUBLE', 'NULL', 'FALSE', 'TRUE', - 'CALL', 'ENDCALL', 'OPEN_EDELIMITER', 'CLOSE_EDELIMITER', - 'BLOCK', 'ENDBLOCK', 'VERBATIM', 'ENDVERBATIM', - 'EXTENDS', 'INCLUDE', 'WITH', 'DO', - 'RETURN', 'AUTOESCAPE', 'ENDAUTOESCAPE', 'BREAK', - 'CONTINUE', 'RAW_FRAGMENT', 'DEFINED', 'EMPTY', - 'EVEN', 'ODD', 'NUMERIC', 'SCALAR', - 'ITERABLE', 'CBRACKET_OPEN', 'CBRACKET_CLOSE', 'error', - 'program', 'volt_language', 'statement_list', 'statement', - 'raw_fragment', 'if_statement', 'elseif_statement', 'elsefor_statement', - 'for_statement', 'switch_statement', 'case_clause', 'set_statement', - 'echo_statement', 'block_statement', 'extends_statement', 'include_statement', - 'do_statement', 'return_statement', 'autoescape_statement', 'verbatim_statement', - 'break_statement', 'continue_statement', 'macro_statement', 'empty_statement', - 'macro_call_statement', 'expr', 'set_assignments', 'set_assignment', - 'assignable_expr', 'macro_parameters', 'macro_parameter', 'macro_parameter_default', - 'argument_list', 'array_list', 'slice_offset', 'array_item', - 'function_call', 'argument_item', - ); - - /* For tracing reduce actions, the names of all rules are required. -*/ - static $yyRuleName = array( - 'program ::= volt_language', - 'volt_language ::= statement_list', - 'statement_list ::= statement_list statement', - 'statement_list ::= statement', - 'statement ::= raw_fragment', - 'statement ::= if_statement', - 'statement ::= elseif_statement', - 'statement ::= elsefor_statement', - 'statement ::= for_statement', - 'statement ::= switch_statement', - 'statement ::= case_clause', - 'statement ::= set_statement', - 'statement ::= echo_statement', - 'statement ::= block_statement', - 'statement ::= extends_statement', - 'statement ::= include_statement', - 'statement ::= do_statement', - 'statement ::= return_statement', - 'statement ::= autoescape_statement', - 'statement ::= verbatim_statement', - 'statement ::= break_statement', - 'statement ::= continue_statement', - 'statement ::= macro_statement', - 'statement ::= empty_statement', - 'statement ::= macro_call_statement', - 'if_statement ::= OPEN_DELIMITER IF expr CLOSE_DELIMITER statement_list OPEN_DELIMITER ENDIF CLOSE_DELIMITER', - 'if_statement ::= OPEN_DELIMITER IF expr CLOSE_DELIMITER OPEN_DELIMITER ENDIF CLOSE_DELIMITER', - 'if_statement ::= OPEN_DELIMITER IF expr CLOSE_DELIMITER statement_list OPEN_DELIMITER ELSE CLOSE_DELIMITER statement_list OPEN_DELIMITER ENDIF CLOSE_DELIMITER', - 'if_statement ::= OPEN_DELIMITER IF expr CLOSE_DELIMITER statement_list OPEN_DELIMITER ELSE CLOSE_DELIMITER OPEN_DELIMITER ENDIF CLOSE_DELIMITER', - 'if_statement ::= OPEN_DELIMITER IF expr CLOSE_DELIMITER OPEN_DELIMITER ELSE CLOSE_DELIMITER OPEN_DELIMITER ENDIF CLOSE_DELIMITER', - 'elseif_statement ::= OPEN_DELIMITER ELSEIF expr CLOSE_DELIMITER', - 'elsefor_statement ::= OPEN_DELIMITER ELSEFOR CLOSE_DELIMITER', - 'for_statement ::= OPEN_DELIMITER FOR IDENTIFIER IN expr CLOSE_DELIMITER statement_list OPEN_DELIMITER ENDFOR CLOSE_DELIMITER', - 'for_statement ::= OPEN_DELIMITER FOR IDENTIFIER IN expr IF expr CLOSE_DELIMITER statement_list OPEN_DELIMITER ENDFOR CLOSE_DELIMITER', - 'for_statement ::= OPEN_DELIMITER FOR IDENTIFIER COMMA IDENTIFIER IN expr CLOSE_DELIMITER statement_list OPEN_DELIMITER ENDFOR CLOSE_DELIMITER', - 'for_statement ::= OPEN_DELIMITER FOR IDENTIFIER COMMA IDENTIFIER IN expr IF expr CLOSE_DELIMITER statement_list OPEN_DELIMITER ENDFOR CLOSE_DELIMITER', - 'switch_statement ::= OPEN_DELIMITER SWITCH expr CLOSE_DELIMITER statement_list OPEN_DELIMITER ENDSWITCH CLOSE_DELIMITER', - 'switch_statement ::= OPEN_DELIMITER SWITCH expr CLOSE_DELIMITER OPEN_DELIMITER ENDSWITCH CLOSE_DELIMITER', - 'case_clause ::= OPEN_DELIMITER CASE expr CLOSE_DELIMITER', - 'case_clause ::= OPEN_DELIMITER DEFAULT CLOSE_DELIMITER', - 'set_statement ::= OPEN_DELIMITER SET set_assignments CLOSE_DELIMITER', - 'set_assignments ::= set_assignments COMMA set_assignment', - 'set_assignments ::= set_assignment', - 'set_assignment ::= assignable_expr ASSIGN expr', - 'set_assignment ::= assignable_expr ADD_ASSIGN expr', - 'set_assignment ::= assignable_expr SUB_ASSIGN expr', - 'set_assignment ::= assignable_expr MUL_ASSIGN expr', - 'set_assignment ::= assignable_expr DIV_ASSIGN expr', - 'assignable_expr ::= IDENTIFIER', - 'assignable_expr ::= assignable_expr SBRACKET_OPEN expr SBRACKET_CLOSE', - 'assignable_expr ::= assignable_expr DOT assignable_expr', - 'macro_statement ::= OPEN_DELIMITER MACRO IDENTIFIER PARENTHESES_OPEN PARENTHESES_CLOSE CLOSE_DELIMITER statement_list OPEN_DELIMITER ENDMACRO CLOSE_DELIMITER', - 'macro_statement ::= OPEN_DELIMITER MACRO IDENTIFIER PARENTHESES_OPEN macro_parameters PARENTHESES_CLOSE CLOSE_DELIMITER statement_list OPEN_DELIMITER ENDMACRO CLOSE_DELIMITER', - 'macro_parameters ::= macro_parameters COMMA macro_parameter', - 'macro_parameters ::= macro_parameter', - 'macro_parameter ::= IDENTIFIER', - 'macro_parameter ::= IDENTIFIER ASSIGN macro_parameter_default', - 'macro_parameter_default ::= INTEGER', - 'macro_parameter_default ::= STRING', - 'macro_parameter_default ::= DOUBLE', - 'macro_parameter_default ::= NULL', - 'macro_parameter_default ::= FALSE', - 'macro_parameter_default ::= TRUE', - 'macro_call_statement ::= OPEN_DELIMITER CALL expr PARENTHESES_OPEN argument_list PARENTHESES_CLOSE CLOSE_DELIMITER statement_list OPEN_DELIMITER ENDCALL CLOSE_DELIMITER', - 'macro_call_statement ::= OPEN_DELIMITER CALL expr PARENTHESES_OPEN PARENTHESES_CLOSE CLOSE_DELIMITER OPEN_DELIMITER ENDCALL CLOSE_DELIMITER', - 'empty_statement ::= OPEN_DELIMITER CLOSE_DELIMITER', - 'echo_statement ::= OPEN_EDELIMITER expr CLOSE_EDELIMITER', - 'block_statement ::= OPEN_DELIMITER BLOCK IDENTIFIER CLOSE_DELIMITER statement_list OPEN_DELIMITER ENDBLOCK CLOSE_DELIMITER', - 'block_statement ::= OPEN_DELIMITER BLOCK IDENTIFIER CLOSE_DELIMITER OPEN_DELIMITER ENDBLOCK CLOSE_DELIMITER', - 'verbatim_statement ::= OPEN_DELIMITER VERBATIM CLOSE_DELIMITER raw_fragment OPEN_DELIMITER ENDVERBATIM CLOSE_DELIMITER', - 'verbatim_statement ::= OPEN_DELIMITER VERBATIM CLOSE_DELIMITER OPEN_DELIMITER ENDVERBATIM CLOSE_DELIMITER', - 'extends_statement ::= OPEN_DELIMITER EXTENDS expr CLOSE_DELIMITER', - 'include_statement ::= OPEN_DELIMITER INCLUDE expr CLOSE_DELIMITER', - 'include_statement ::= OPEN_DELIMITER INCLUDE expr WITH expr CLOSE_DELIMITER', - 'do_statement ::= OPEN_DELIMITER DO expr CLOSE_DELIMITER', - 'return_statement ::= OPEN_DELIMITER RETURN expr CLOSE_DELIMITER', - 'autoescape_statement ::= OPEN_DELIMITER AUTOESCAPE FALSE CLOSE_DELIMITER statement_list OPEN_DELIMITER ENDAUTOESCAPE CLOSE_DELIMITER', - 'autoescape_statement ::= OPEN_DELIMITER AUTOESCAPE TRUE CLOSE_DELIMITER statement_list OPEN_DELIMITER ENDAUTOESCAPE CLOSE_DELIMITER', - 'break_statement ::= OPEN_DELIMITER BREAK CLOSE_DELIMITER', - 'continue_statement ::= OPEN_DELIMITER CONTINUE CLOSE_DELIMITER', - 'raw_fragment ::= RAW_FRAGMENT', - 'expr ::= MINUS expr', - 'expr ::= PLUS expr', - 'expr ::= expr MINUS expr', - 'expr ::= expr PLUS expr', - 'expr ::= expr TIMES expr', - 'expr ::= expr TIMES TIMES expr', - 'expr ::= expr DIVIDE expr', - 'expr ::= expr DIVIDE DIVIDE expr', - 'expr ::= expr MOD expr', - 'expr ::= expr AND expr', - 'expr ::= expr OR expr', - 'expr ::= expr CONCAT expr', - 'expr ::= expr PIPE expr', - 'expr ::= expr RANGE expr', - 'expr ::= expr EQUALS expr', - 'expr ::= expr NOTEQUALS DEFINED', - 'expr ::= expr IS DEFINED', - 'expr ::= expr NOTEQUALS EMPTY', - 'expr ::= expr IS EMPTY', - 'expr ::= expr NOTEQUALS EVEN', - 'expr ::= expr IS EVEN', - 'expr ::= expr NOTEQUALS ODD', - 'expr ::= expr IS ODD', - 'expr ::= expr NOTEQUALS NUMERIC', - 'expr ::= expr IS NUMERIC', - 'expr ::= expr NOTEQUALS SCALAR', - 'expr ::= expr IS SCALAR', - 'expr ::= expr NOTEQUALS ITERABLE', - 'expr ::= expr IS ITERABLE', - 'expr ::= expr IS expr', - 'expr ::= expr NOTEQUALS expr', - 'expr ::= expr IDENTICAL expr', - 'expr ::= expr NOTIDENTICAL expr', - 'expr ::= expr LESS expr', - 'expr ::= expr GREATER expr', - 'expr ::= expr GREATEREQUAL expr', - 'expr ::= expr LESSEQUAL expr', - 'expr ::= expr DOT expr', - 'expr ::= expr IN expr', - 'expr ::= expr NOT IN expr', - 'expr ::= NOT expr', - 'expr ::= expr INCR', - 'expr ::= expr DECR', - 'expr ::= PARENTHESES_OPEN expr PARENTHESES_CLOSE', - 'expr ::= SBRACKET_OPEN SBRACKET_CLOSE', - 'expr ::= SBRACKET_OPEN array_list SBRACKET_CLOSE', - 'expr ::= CBRACKET_OPEN CBRACKET_CLOSE', - 'expr ::= CBRACKET_OPEN array_list CBRACKET_CLOSE', - 'expr ::= expr SBRACKET_OPEN expr SBRACKET_CLOSE', - 'expr ::= expr QUESTION expr COLON expr', - 'expr ::= expr SBRACKET_OPEN COLON slice_offset SBRACKET_CLOSE', - 'expr ::= expr SBRACKET_OPEN slice_offset COLON SBRACKET_CLOSE', - 'expr ::= expr SBRACKET_OPEN slice_offset COLON slice_offset SBRACKET_CLOSE', - 'slice_offset ::= INTEGER', - 'slice_offset ::= IDENTIFIER', - 'array_list ::= array_list COMMA array_item', - 'array_list ::= array_item', - 'array_item ::= STRING COLON expr', - 'array_item ::= expr', - 'expr ::= function_call', - 'function_call ::= expr PARENTHESES_OPEN argument_list PARENTHESES_CLOSE', - 'function_call ::= expr PARENTHESES_OPEN PARENTHESES_CLOSE', - 'argument_list ::= argument_list COMMA argument_item', - 'argument_list ::= argument_item', - 'argument_item ::= expr', - 'argument_item ::= STRING COLON expr', - 'expr ::= IDENTIFIER', - 'expr ::= INTEGER', - 'expr ::= STRING', - 'expr ::= DOUBLE', - 'expr ::= NULL', - 'expr ::= FALSE', - 'expr ::= TRUE', - ); - - /* The following function deletes the value associated with a -** symbol. The symbol can be either a terminal or nonterminal. -** "yymajor" is the symbol code, and "yypminor" is a pointer to -** the value. -*/ - private function yy_destructor($yymajor, $yypminor) - { - switch ($yymajor) { - /* Here is inserted the actions which take place when a - ** terminal or non-terminal is destroyed. This can happen - ** when the symbol is popped from the stack during a - ** reduce or during error processing or when a parser is - ** being destroyed before it is finished parsing. - ** - ** Note: during a reduce, the only symbols destroyed are those - ** which appear on the RHS of the rule, but which are not used - ** inside the C code. - */ - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 16: - case 17: - case 18: - case 19: - case 20: - case 21: - case 22: - case 23: - case 24: - case 25: - case 26: - case 27: - case 28: - case 29: - case 30: - case 31: - case 32: - case 33: - case 34: - case 35: - case 36: - case 37: - case 38: - case 39: - case 40: - case 41: - case 42: - case 43: - case 44: - case 45: - case 46: - case 47: - case 48: - case 49: - case 50: - case 51: - case 52: - case 53: - case 54: - case 55: - case 56: - case 57: - case 58: - case 59: - case 60: - case 61: - case 62: - case 63: - case 64: - case 65: - case 66: - case 67: - case 68: - case 69: - case 70: - case 71: - case 72: - case 73: - case 74: - case 75: - case 76: - case 77: - case 78: - case 79: - case 80: - case 81: - case 82: - case 83: - case 84: - case 85: - case 86: - if (isset($yypminor->yy0)) { - if (($yypminor->yy0)->free_flag) { - unset(($yypminor->yy0)->token); - } - unset($yypminor->yy0); - } - break; - case 87: - case 88: - case 90: - case 91: - case 92: - case 93: - case 94: - case 95: - case 96: - case 97: - case 98: - case 99: - case 100: - case 101: - case 102: - case 103: - case 104: - case 105: - case 106: - case 107: - case 108: - case 109: - case 110: - case 111: - case 112: - case 113: - case 114: - case 115: - case 116: - case 117: - case 118: - case 119: - case 120: - case 121: - case 122: - case 123: - case 124: - case 89: - case 125: - if (isset($yypminor->yy186)) { - unset($yypminor->yy186); - } - break; - default: - break; /* If no destructor action specified: do nothing */ - } - } - - /* -** Pop the parser's stack once. -** -** If there is a destructor routine associated with the token which -** is popped from the stack, then call it. -** -** Return the major token number for the symbol popped. -*/ - private function yy_pop_parser_stack() - { - if ($this->yyidx < 0) { - return 0; - } - - $yytos = $this->yystack[$this->yyidx]; - - if ($this->yyTraceFILE) { - fprintf( - $this->yyTraceFILE, - "%sPopping %s\n", - $this->yyTracePrompt, - self::$yyTokenName[$yytos->major], - ); - } - - $this->yy_destructor($yytos->major, $yytos->minor); - unset($this->yystack[$this->yyidx]); - $this->yyidx--; - - return $yytos->major; - } - - /* -** Deallocate and destroy a parser. Destructors are all called for -** all stack elements before shutting the parser down. -** -** Inputs: -** -*/ - function __destruct() - { - while ($this->yyidx >= 0) { - $this->yy_pop_parser_stack(); - } - } - - /* -** Find the appropriate action for a parser given the terminal -** look-ahead token iLookAhead. -** -** If the look-ahead token is YYNOCODE, then check to see if the action is -** independent of the look-ahead. If it is, return the action, otherwise -** return YY_NO_ACTION. -*/ - private function yy_find_shift_action($iLookAhead) - { - $stateno = $this->yystack[$this->yyidx]->stateno; - - if ($stateno > self::YY_SHIFT_MAX || ($i = self::$yy_shift_ofst[$stateno]) == self::YY_SHIFT_USE_DFLT) { - return self::$yy_default[$stateno]; - } - if ($iLookAhead == self::YYNOCODE) { - return $this->YY_NO_ACTION; - } - $i += $iLookAhead; - if ($i < 0 || $i >= count(self::$yy_action) || self::$yy_lookahead[$i] != $iLookAhead) { - if ($iLookAhead > 0) { - if ( - isset(self::$yyFallback[$iLookAhead]) && - ($iFallback = self::$yyFallback[$iLookAhead]) != 0 - ) { - if ($this->yyTraceFILE) { - fprintf( - $this->yyTraceFILE, - "%sFALLBACK %s => %s\n", - $this->yyTracePrompt, - self::$yyTokenName[$iLookAhead], - self::$yyTokenName[$iFallback] - ); - } - return $this->yy_find_shift_action($iFallback); - } - } - return self::$yy_default[$stateno]; - } - - return self::$yy_action[$i]; - } - - /* -** Find the appropriate action for a parser given the non-terminal -** look-ahead token iLookAhead. -** -** If the look-ahead token is YYNOCODE, then check to see if the action is -** independent of the look-ahead. If it is, return the action, otherwise -** return YY_NO_ACTION. -*/ - private function yy_find_reduce_action( - $stateno, /* Current state number */ - $iLookAhead /* The look-ahead token */ - ) { - if ( - $stateno > self::YY_REDUCE_MAX || - ($i = self::$yy_reduce_ofst[$stateno]) == self::YY_REDUCE_USE_DFLT - ) { - return self::$yy_default[$stateno]; - } - if ($iLookAhead == self::YYNOCODE) { - return $this->YY_NO_ACTION; - } - $i += $iLookAhead; - if ($i < 0 || $i >= count(self::$yy_action) || self::$yy_lookahead[$i] != $iLookAhead) { - return self::$yy_default[$stateno]; - } - - return self::$yy_action[$i]; - } - - /** - * Perform a shift action. - */ - private function yy_shift( - $yyNewState, /* The new state to shift in */ - $yyMajor, /* The major token to shift in */ - $yypMinor /* Pointer ot the minor token to shift in */ - ) { - $this->yyidx++; - if (isset($this->yystack[$this->yyidx])) { - $yytos = $this->yystack[$this->yyidx]; - } else { - $yytos = new phvolt_yyStackEntry(); - $this->yystack[$this->yyidx] = $yytos; - } - - $yytos->stateno = $yyNewState; - $yytos->major = $yyMajor; - $yytos->minor = $yypMinor; - - if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%sShift %d\n", $this->yyTracePrompt, $yyNewState); - fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt); - for ($i = 1; $i <= $this->yyidx; $i++) { - $ent = $this->yystack[$i]; - fprintf($this->yyTraceFILE, " %s", self::$yyTokenName[$ent->major]); - } - fprintf($this->yyTraceFILE, "\n"); - } - } - - /* The following table contains information about every rule that -** is used during the reduce. -** Rather than pollute memory with a large number of arrays, -** we store both data points in the same array, indexing by -** rule number * 2. -static const struct { - YYCODETYPE lhs; // Symbol on the left-hand side of the rule - unsigned char nrhs; // Number of right-hand side symbols in the rule -} yyRuleInfo[] = { -*/ - static $yyRuleInfo = array( - 88, 1, - 89, 1, - 90, 2, - 90, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 91, 1, - 93, 8, - 93, 7, - 93, 12, - 93, 11, - 93, 10, - 94, 4, - 95, 3, - 96, 10, - 96, 12, - 96, 12, - 96, 14, - 97, 8, - 97, 7, - 98, 4, - 98, 3, - 99, 4, - 114, 3, - 114, 1, - 115, 3, - 115, 3, - 115, 3, - 115, 3, - 115, 3, - 116, 1, - 116, 4, - 116, 3, - 110, 10, - 110, 11, - 117, 3, - 117, 1, - 118, 1, - 118, 3, - 119, 1, - 119, 1, - 119, 1, - 119, 1, - 119, 1, - 119, 1, - 112, 11, - 112, 9, - 111, 2, - 100, 3, - 101, 8, - 101, 7, - 107, 7, - 107, 6, - 102, 4, - 103, 4, - 103, 6, - 104, 4, - 105, 4, - 106, 8, - 106, 8, - 108, 3, - 109, 3, - 92, 1, - 113, 2, - 113, 2, - 113, 3, - 113, 3, - 113, 3, - 113, 4, - 113, 3, - 113, 4, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 3, - 113, 4, - 113, 2, - 113, 2, - 113, 2, - 113, 3, - 113, 2, - 113, 3, - 113, 2, - 113, 3, - 113, 4, - 113, 5, - 113, 5, - 113, 5, - 113, 6, - 122, 1, - 122, 1, - 121, 3, - 121, 1, - 123, 3, - 123, 1, - 113, 1, - 124, 4, - 124, 3, - 120, 3, - 120, 1, - 125, 1, - 125, 3, - 113, 1, - 113, 1, - 113, 1, - 113, 1, - 113, 1, - 113, 1, - 113, 1, - ); - - /** - * Perform a reduce action and the shift that must immediately - * follow the reduce. - * - * @param int $yyruleno Number of the rule by which to reduce - */ - private function yy_reduce(int $yyruleno): void - { - /* The top of the parser's stack */ - $yymsp = $this->yystack[$this->yyidx]; - if ($this->yyTraceFILE && isset(self::$yyRuleName[$yyruleno])) { - fprintf($this->yyTraceFILE, "%sReduce [%s].\n", $this->yyTracePrompt, self::$yyRuleName[$yyruleno]); - } - - switch ($yyruleno) { - /* Beginning here are the reduction cases. A typical example - ** follows: - ** case 0: - ** #line - ** { ... } // User supplied code - ** #line - ** break; - */ - case 0: - case 1: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 16: - case 17: - case 18: - case 19: - case 20: - case 21: - case 22: - case 23: - case 24: - case 140: - $this->output = $yymsp->minor; - break; - case 2: - phvolt_ret_zval_list( - $this->output, - $this->yystack[$this->yyidx + -1]->minor, - $this->yystack[$this->yyidx + 0]->minor, - ); - break; - case 3: - case 42: - case 54: - case 137: - case 144: - phvolt_ret_zval_list( - $this->output, - null, - $this->yystack[$this->yyidx + 0]->minor, - ); - break; - case 25: - phvolt_ret_if_statement( - $this->output, - $this->yystack[$this->yyidx + -5]->minor, - $this->yystack[$this->yyidx + -3]->minor, - null, - $this->status->getState(), - ); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -7]->minor); - $this->yy_destructor(31, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(33, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 26: - phvolt_ret_if_statement($this->output, $this->yystack[$this->yyidx + -4]->minor, null, null, $this->status->getState()); - - $this->yy_destructor(1, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(31, $this->yystack[$this->yyidx + -5]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(33, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 27: - phvolt_ret_if_statement($this->output, $this->yystack[$this->yyidx + -9]->minor, $this->yystack[$this->yyidx + -7]->minor, $this->yystack[$this->yyidx + -3]->minor, $this->status->getState()); - - $this->yy_destructor(1, $this->yystack[$this->yyidx + -11]->minor); - $this->yy_destructor(31, $this->yystack[$this->yyidx + -10]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -8]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(34, $this->yystack[$this->yyidx + -5]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(33, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 28: - phvolt_ret_if_statement($this->output, $this->yystack[$this->yyidx + -8]->minor, $this->yystack[$this->yyidx + -6]->minor, null, $this->status->getState()); - - $this->yy_destructor(1, $this->yystack[$this->yyidx + -10]->minor); - $this->yy_destructor(31, $this->yystack[$this->yyidx + -9]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -7]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -5]->minor); - $this->yy_destructor(34, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(33, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 29: - phvolt_ret_if_statement($this->output, $this->yystack[$this->yyidx + -7]->minor, null, null, $this->status->getState()); - - $this->yy_destructor(1, $this->yystack[$this->yyidx + -9]->minor); - $this->yy_destructor(31, $this->yystack[$this->yyidx + -8]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -5]->minor); - $this->yy_destructor(34, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(33, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 30: - phvolt_ret_elseif_statement($this->output, $this->yystack[$this->yyidx + -1]->minor, $this->status->getState()); - - $this->yy_destructor(1, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(35, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 31: - phvolt_ret_elsefor_statement($this->output, $this->status->getState()); - - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(36, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 32: - phvolt_ret_for_statement($this->output, $this->yystack[$this->yyidx + -7]->minor, null, $this->yystack[$this->yyidx + -5]->minor, null, $this->yystack[$this->yyidx + -3]->minor, $this->status->getState()); - - $this->yy_destructor(1, $this->yystack[$this->yyidx + -9]->minor); - $this->yy_destructor(37, $this->yystack[$this->yyidx + -8]->minor); - $this->yy_destructor(8, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(39, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 33: - phvolt_ret_for_statement($this->output, $this->yystack[$this->yyidx + -9]->minor, null, $this->yystack[$this->yyidx + -7]->minor, $this->yystack[$this->yyidx + -5]->minor, $this->yystack[$this->yyidx + -3]->minor, $this->status->getState()); - - $this->yy_destructor(1, $this->yystack[$this->yyidx + -11]->minor); - $this->yy_destructor(37, $this->yystack[$this->yyidx + -10]->minor); - $this->yy_destructor(8, $this->yystack[$this->yyidx + -8]->minor); - $this->yy_destructor(31, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(39, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 34: - phvolt_ret_for_statement($this->output, $this->yystack[$this->yyidx + -7]->minor, $this->yystack[$this->yyidx + -9]->minor, $this->yystack[$this->yyidx + -5]->minor, null, $this->yystack[$this->yyidx + -3]->minor, $this->status->getState()); - - $this->yy_destructor(1, $this->yystack[$this->yyidx + -11]->minor); - $this->yy_destructor(37, $this->yystack[$this->yyidx + -10]->minor); - $this->yy_destructor(2, $this->yystack[$this->yyidx + -8]->minor); - $this->yy_destructor(8, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(39, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 35: - phvolt_ret_for_statement($this->output, $this->yystack[$this->yyidx + -9]->minor, $this->yystack[$this->yyidx + -11]->minor, $this->yystack[$this->yyidx + -7]->minor, $this->yystack[$this->yyidx + -5]->minor, $this->yystack[$this->yyidx + -3]->minor, $this->status->getState()); - - $this->yy_destructor(1, $this->yystack[$this->yyidx + -13]->minor); - $this->yy_destructor(37, $this->yystack[$this->yyidx + -12]->minor); - $this->yy_destructor(2, $this->yystack[$this->yyidx + -10]->minor); - $this->yy_destructor(8, $this->yystack[$this->yyidx + -8]->minor); - $this->yy_destructor(31, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(39, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 36: - phvolt_ret_switch_statement($this->output, $this->yystack[$this->yyidx + -5]->minor, $this->yystack[$this->yyidx + -3]->minor, $this->status->getState()); - - $this->yy_destructor(1, $this->yystack[$this->yyidx + -7]->minor); - $this->yy_destructor(40, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(41, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 37: -#line 332 "parser.php.lemon" - { - phvolt_ret_switch_statement($this->output, $this->yystack[$this->yyidx + -4]->minor, null, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(40, $this->yystack[$this->yyidx + -5]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(41, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 1787 "parser.php.php" - break; - case 38: -#line 337 "parser.php.lemon" - { - phvolt_ret_case_clause($this->output, $this->yystack[$this->yyidx + -1]->minor, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(42, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 1797 "parser.php.php" - break; - case 39: -#line 342 "parser.php.lemon" - { - phvolt_ret_case_clause($this->output, null, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(43, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 1807 "parser.php.php" - break; - case 40: -#line 346 "parser.php.lemon" - { - phvolt_ret_set_statement($this->output, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(44, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 1817 "parser.php.php" - break; - case 41: - case 53: - case 136: - case 143: -#line 350 "parser.php.lemon" - { - phvolt_ret_zval_list($this->output, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor); - - $this->yy_destructor(2, $this->yystack[$this->yyidx + -1]->minor); - } -#line 1828 "parser.php.php" - break; - case 43: -#line 358 "parser.php.lemon" - { - phvolt_ret_set_assignment($this->output, $this->yystack[$this->yyidx + -2]->minor, Compiler::PHVOLT_T_ASSIGN, $this->yystack[$this->yyidx + 0]->minor, $this->status->getState()); - $this->yy_destructor(45, $this->yystack[$this->yyidx + -1]->minor); - } -#line 1836 "parser.php.php" - break; - case 44: -#line 362 "parser.php.lemon" - { - phvolt_ret_set_assignment($this->output, $this->yystack[$this->yyidx + -2]->minor, Compiler::PHVOLT_T_ADD_ASSIGN, $this->yystack[$this->yyidx + 0]->minor, $this->status->getState()); - $this->yy_destructor(46, $this->yystack[$this->yyidx + -1]->minor); - } -#line 1844 "parser.php.php" - break; - case 45: -#line 366 "parser.php.lemon" - { - phvolt_ret_set_assignment($this->output, $this->yystack[$this->yyidx + -2]->minor, Compiler::PHVOLT_T_SUB_ASSIGN, $this->yystack[$this->yyidx + 0]->minor, $this->status->getState()); - $this->yy_destructor(47, $this->yystack[$this->yyidx + -1]->minor); - } -#line 1852 "parser.php.php" - break; - case 46: -#line 370 "parser.php.lemon" - { - phvolt_ret_set_assignment($this->output, $this->yystack[$this->yyidx + -2]->minor, Compiler::PHVOLT_T_MUL_ASSIGN, $this->yystack[$this->yyidx + 0]->minor, $this->status->getState()); - $this->yy_destructor(48, $this->yystack[$this->yyidx + -1]->minor); - } -#line 1860 "parser.php.php" - break; - case 47: -#line 374 "parser.php.lemon" - { - phvolt_ret_set_assignment($this->output, $this->yystack[$this->yyidx + -2]->minor, Compiler::PHVOLT_T_DIV_ASSIGN, $this->yystack[$this->yyidx + 0]->minor, $this->status->getState()); - $this->yy_destructor(49, $this->yystack[$this->yyidx + -1]->minor); - } -#line 1868 "parser.php.php" - break; - case 48: - case 135: - case 147: - phvolt_ret_literal_zval($this->output, Compiler::PHVOLT_T_IDENTIFIER, $this->yystack[$this->yyidx + 0]->minor, $this->status->getState()); - - break; - case 49: - case 129: -#line 382 "parser.php.lemon" - { - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_ARRAYACCESS, $this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + -1]->minor, null, $this->status->getState()); - $this->yy_destructor(24, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(50, $this->yystack[$this->yyidx + 0]->minor); - } -#line 1888 "parser.php.php" - break; - case 50: - case 118: -#line 386 "parser.php.lemon" - { - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_DOT, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(30, $this->yystack[$this->yyidx + -1]->minor); - } -#line 1897 "parser.php.php" - break; - case 51: -#line 390 "parser.php.lemon" - { - phvolt_ret_macro_statement($this->output, $this->yystack[$this->yyidx + -7]->minor, null, $this->yystack[$this->yyidx + -3]->minor, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -9]->minor); - $this->yy_destructor(51, $this->yystack[$this->yyidx + -8]->minor); - $this->yy_destructor(29, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(52, $this->yystack[$this->yyidx + -5]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(53, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 1912 "parser.php.php" - break; - case 52: -#line 394 "parser.php.lemon" - { - phvolt_ret_macro_statement($this->output, $this->yystack[$this->yyidx + -8]->minor, $this->yystack[$this->yyidx + -6]->minor, $this->yystack[$this->yyidx + -3]->minor, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -10]->minor); - $this->yy_destructor(51, $this->yystack[$this->yyidx + -9]->minor); - $this->yy_destructor(29, $this->yystack[$this->yyidx + -7]->minor); - $this->yy_destructor(52, $this->yystack[$this->yyidx + -5]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(53, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 1927 "parser.php.php" - break; - case 55: -#line 406 "parser.php.lemon" - { - phvolt_ret_macro_parameter($this->output, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - } -#line 1934 "parser.php.php" - break; - case 56: - phvolt_ret_macro_parameter($this->output, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->status->getState()); - $this->yy_destructor(45, $this->yystack[$this->yyidx + -1]->minor); - break; - case 57: - case 134: - case 148: - phvolt_ret_literal_zval($this->output, Compiler::PHVOLT_T_INTEGER, $this->yystack[$this->yyidx + 0]->minor, $this->status->getState()); - break; - case 58: - case 149: - phvolt_ret_literal_zval($this->output, Compiler::PHVOLT_T_STRING, $this->yystack[$this->yyidx + 0]->minor, $this->status->getState()); - break; - case 59: - case 150: - phvolt_ret_literal_zval($this->output, Compiler::PHVOLT_T_DOUBLE, $this->yystack[$this->yyidx + 0]->minor, $this->status->getState()); - break; - case 60: - case 151: - phvolt_ret_literal_zval($this->output, Compiler::PHVOLT_T_NULL, null, $this->status->getState()); - $this->yy_destructor(57, $this->yystack[$this->yyidx + 0]->minor); - break; - case 61: - case 152: - phvolt_ret_literal_zval($this->output, Compiler::PHVOLT_T_FALSE, null, $this->status->getState()); - $this->yy_destructor(58, $this->yystack[$this->yyidx + 0]->minor); - break; - case 62: - case 153: - phvolt_ret_literal_zval($this->output, Compiler::PHVOLT_T_TRUE, null, $this->status->getState()); - $this->yy_destructor(59, $this->yystack[$this->yyidx + 0]->minor); - break; - case 63: -#line 438 "parser.php.lemon" - { - phvolt_ret_macro_call_statement($this->output, $this->yystack[$this->yyidx + -8]->minor, $this->yystack[$this->yyidx + -6]->minor, $this->yystack[$this->yyidx + -3]->minor, $this->status->getState()); - - $this->yy_destructor(1, $this->yystack[$this->yyidx + -10]->minor); - $this->yy_destructor(60, $this->yystack[$this->yyidx + -9]->minor); - $this->yy_destructor(29, $this->yystack[$this->yyidx + -7]->minor); - $this->yy_destructor(52, $this->yystack[$this->yyidx + -5]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(61, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 2010 "parser.php.php" - break; - case 64: -#line 442 "parser.php.lemon" - { - phvolt_ret_macro_call_statement($this->output, $this->yystack[$this->yyidx + -6]->minor, null, null, $this->status->getState()); - - $this->yy_destructor(1, $this->yystack[$this->yyidx + -8]->minor); - $this->yy_destructor(60, $this->yystack[$this->yyidx + -7]->minor); - $this->yy_destructor(29, $this->yystack[$this->yyidx + -5]->minor); - $this->yy_destructor(52, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(61, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 2025 "parser.php.php" - break; - case 65: -#line 446 "parser.php.lemon" - { - phvolt_ret_empty_statement($this->output, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 2034 "parser.php.php" - break; - case 66: - phvolt_ret_echo_statement($this->output, $this->yystack[$this->yyidx + -1]->minor, $this->status->getState()); - $this->yy_destructor(62, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(63, $this->yystack[$this->yyidx + 0]->minor); - break; - case 67: -#line 454 "parser.php.lemon" - { - phvolt_ret_block_statement($this->output, $this->yystack[$this->yyidx + -5]->minor, $this->yystack[$this->yyidx + -3]->minor, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -7]->minor); - $this->yy_destructor(64, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(65, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 2056 "parser.php.php" - break; - case 68: - phvolt_ret_block_statement($this->output, $this->yystack[$this->yyidx + -4]->minor, null, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(64, $this->yystack[$this->yyidx + -5]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(65, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 69: - $this->output = $this->yystack[$this->yyidx + -3]->minor; - $this->yy_destructor(1, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(66, $this->yystack[$this->yyidx + -5]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(67, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 70: - phvolt_ret_literal_zval($this->output, Compiler::PHVOLT_T_RAW_FRAGMENT, null, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -5]->minor); - $this->yy_destructor(66, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(67, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 71: - phvolt_ret_extends_statement( - $this->output, - $this->yystack[$this->yyidx - 1]->minor, - $this->status->getState(), - ); - $this->yy_destructor(1, $this->yystack[$this->yyidx - 3]->minor); - $this->yy_destructor(68, $this->yystack[$this->yyidx - 2]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx]->minor); - break; - case 72: -#line 486 "parser.php.lemon" - { - phvolt_ret_include_statement($this->output, $this->yystack[$this->yyidx + -1]->minor, null, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(69, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 2128 "parser.php.php" - break; - case 73: - phvolt_ret_include_statement($this->output, $this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -5]->minor); - $this->yy_destructor(69, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(70, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 74: -#line 494 "parser.php.lemon" - { - phvolt_ret_do_statement($this->output, $this->yystack[$this->yyidx + -1]->minor, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(71, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 2149 "parser.php.php" - break; - case 75: -#line 498 "parser.php.lemon" - { - phvolt_ret_return_statement($this->output, $this->yystack[$this->yyidx + -1]->minor, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(72, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 2159 "parser.php.php" - break; - case 76: -#line 502 "parser.php.lemon" - { - phvolt_ret_autoescape_statement($this->output, 0, $this->yystack[$this->yyidx + -3]->minor, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -7]->minor); - $this->yy_destructor(73, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(58, $this->yystack[$this->yyidx + -5]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(74, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 2173 "parser.php.php" - break; - case 77: -#line 506 "parser.php.lemon" - { - phvolt_ret_autoescape_statement($this->output, 1, $this->yystack[$this->yyidx + -3]->minor, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -7]->minor); - $this->yy_destructor(73, $this->yystack[$this->yyidx + -6]->minor); - $this->yy_destructor(59, $this->yystack[$this->yyidx + -5]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(74, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 2187 "parser.php.php" - break; - case 78: -#line 510 "parser.php.lemon" - { - phvolt_ret_break_statement($this->output, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(75, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - } -#line 2197 "parser.php.php" - break; - case 79: - phvolt_ret_continue_statement($this->output, $this->status->getState()); - $this->yy_destructor(1, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(76, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(32, $this->yystack[$this->yyidx + 0]->minor); - break; - case 80: - phvolt_ret_literal_zval($this->output, Compiler::PHVOLT_T_RAW_FRAGMENT, $this->yystack[$this->yyidx + 0]->minor, $this->status->getState()); - break; - case 81: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_MINUS, null, $this->yystack[$this->yyidx]->minor, null, $this->status->getState()); - $this->yy_destructor(22, $this->yystack[$this->yyidx -1]->minor); - break; - case 82: -#line 526 "parser.php.lemon" - { - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_PLUS, null, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(21, $this->yystack[$this->yyidx + -1]->minor); - } -#line 2230 "parser.php.php" - break; - case 83: -#line 530 "parser.php.lemon" - { - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_SUB, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(22, $this->yystack[$this->yyidx + -1]->minor); - } -#line 2238 "parser.php.php" - break; - case 84: -#line 534 "parser.php.lemon" - { - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_ADD, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(21, $this->yystack[$this->yyidx + -1]->minor); - } -#line 2246 "parser.php.php" - break; - case 85: -#line 538 "parser.php.lemon" - { - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_MUL, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(19, $this->yystack[$this->yyidx + -1]->minor); - } -#line 2254 "parser.php.php" - break; - case 86: -#line 542 "parser.php.lemon" - { - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_POW, $this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(19, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(19, $this->yystack[$this->yyidx + -1]->minor); - } -#line 2263 "parser.php.php" - break; - case 87: -#line 546 "parser.php.lemon" - { - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_DIV, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(18, $this->yystack[$this->yyidx + -1]->minor); - } -#line 2271 "parser.php.php" - break; - case 88: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_MOD, $this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(18, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(18, $this->yystack[$this->yyidx + -1]->minor); - break; - case 89: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_MOD, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(20, $this->yystack[$this->yyidx + -1]->minor); - break; - case 90: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_AND, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(6, $this->yystack[$this->yyidx + -1]->minor); - break; - case 91: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_OR, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(7, $this->yystack[$this->yyidx + -1]->minor); - break; - case 92: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_CONCAT, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(23, $this->yystack[$this->yyidx + -1]->minor); - break; - case 93: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_PIPE, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(25, $this->yystack[$this->yyidx + -1]->minor); - break; - case 94: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_RANGE, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(5, $this->yystack[$this->yyidx + -1]->minor); - break; - case 95: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_EQUALS, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(10, $this->yystack[$this->yyidx + -1]->minor); - break; - case 96: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_NOT_ISSET, $this->yystack[$this->yyidx + -2]->minor, null, null, $this->status->getState()); - $this->yy_destructor(11, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(78, $this->yystack[$this->yyidx + 0]->minor); - break; - case 97: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_ISSET, $this->yystack[$this->yyidx + -2]->minor, null, null, $this->status->getState()); - $this->yy_destructor(9, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(78, $this->yystack[$this->yyidx + 0]->minor); - break; - case 98: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_NOT_ISEMPTY, $this->yystack[$this->yyidx + -2]->minor, null, null, $this->status->getState()); - $this->yy_destructor(11, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(79, $this->yystack[$this->yyidx + 0]->minor); - break; - case 99: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_ISEMPTY, $this->yystack[$this->yyidx + -2]->minor, null, null, $this->status->getState()); - $this->yy_destructor(9, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(79, $this->yystack[$this->yyidx + 0]->minor); - break; - case 100: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_NOT_ISEVEN, $this->yystack[$this->yyidx + -2]->minor, null, null, $this->status->getState()); - $this->yy_destructor(11, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(80, $this->yystack[$this->yyidx + 0]->minor); - break; - case 101: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_ISEVEN, $this->yystack[$this->yyidx + -2]->minor, null, null, $this->status->getState()); - $this->yy_destructor(9, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(80, $this->yystack[$this->yyidx + 0]->minor); - break; - case 102: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_NOT_ISODD, $this->yystack[$this->yyidx + -2]->minor, null, null, $this->status->getState()); - $this->yy_destructor(11, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(81, $this->yystack[$this->yyidx + 0]->minor); - break; - case 103: - phvolt_ret_expr( - $this->output, - Compiler::PHVOLT_T_ISODD, - $this->yystack[$this->yyidx - 2]->minor, - null, - null, - $this->status->getState(), - ); - $this->yy_destructor(9, $this->yystack[$this->yyidx - 1]->minor); - $this->yy_destructor(81, $this->yystack[$this->yyidx]->minor); - break; - case 104: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_NOT_ISNUMERIC, $this->yystack[$this->yyidx + -2]->minor, null, null, $this->status->getState()); - $this->yy_destructor(11, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(82, $this->yystack[$this->yyidx + 0]->minor); - break; - case 105: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_ISNUMERIC, $this->yystack[$this->yyidx + -2]->minor, null, null, $this->status->getState()); - $this->yy_destructor(9, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(82, $this->yystack[$this->yyidx + 0]->minor); - break; - case 106: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_NOT_ISSCALAR, $this->yystack[$this->yyidx + -2]->minor, null, null, $this->status->getState()); - $this->yy_destructor(11, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(83, $this->yystack[$this->yyidx + 0]->minor); - break; - case 107: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_ISSCALAR, $this->yystack[$this->yyidx + -2]->minor, null, null, $this->status->getState()); - $this->yy_destructor(9, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(83, $this->yystack[$this->yyidx + 0]->minor); - break; - case 108: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_NOT_ISITERABLE, $this->yystack[$this->yyidx + -2]->minor, null, null, $this->status->getState()); - $this->yy_destructor(11, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(84, $this->yystack[$this->yyidx + 0]->minor); - break; - case 109: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_ISITERABLE, $this->yystack[$this->yyidx + -2]->minor, null, null, $this->status->getState()); - $this->yy_destructor(9, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(84, $this->yystack[$this->yyidx + 0]->minor); - break; - case 110: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_IS, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(9, $this->yystack[$this->yyidx + -1]->minor); - break; - case 111: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_NOTEQUALS, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(11, $this->yystack[$this->yyidx + -1]->minor); - break; - case 112: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_IDENTICAL, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(16, $this->yystack[$this->yyidx + -1]->minor); - break; - case 113: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_NOTIDENTICAL, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(17, $this->yystack[$this->yyidx + -1]->minor); - break; - case 114: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_LESS, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(12, $this->yystack[$this->yyidx + -1]->minor); - break; - case 115: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_GREATER, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(13, $this->yystack[$this->yyidx + -1]->minor); - break; - case 116: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_GREATEREQUAL, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(14, $this->yystack[$this->yyidx + -1]->minor); - break; - case 117: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_LESSEQUAL, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(15, $this->yystack[$this->yyidx + -1]->minor); - break; - case 119: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_IN, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(8, $this->yystack[$this->yyidx + -1]->minor); - break; - case 120: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_NOT_IN, $this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(26, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(8, $this->yystack[$this->yyidx + -1]->minor); - break; - case 121: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_NOT, null, $this->yystack[$this->yyidx + 0]->minor, null, $this->status->getState()); - $this->yy_destructor(26, $this->yystack[$this->yyidx + -1]->minor); - break; - case 122: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_INCR, $this->yystack[$this->yyidx + -1]->minor, null, null, $this->status->getState()); - $this->yy_destructor(27, $this->yystack[$this->yyidx + 0]->minor); - break; - case 123: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_DECR, $this->yystack[$this->yyidx + -1]->minor, null, null, $this->status->getState()); - $this->yy_destructor(28, $this->yystack[$this->yyidx + 0]->minor); - break; - case 124: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_ENCLOSED, $this->yystack[$this->yyidx + -1]->minor, null, null, $this->status->getState()); - $this->yy_destructor(29, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(52, $this->yystack[$this->yyidx + 0]->minor); - break; - case 125: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_ARRAY, null, null, null, $this->status->getState()); - $this->yy_destructor(24, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(50, $this->yystack[$this->yyidx + 0]->minor); - break; - case 126: - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_ARRAY, $this->yystack[$this->yyidx + -1]->minor, null, null, $this->status->getState()); - $this->yy_destructor(24, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(50, $this->yystack[$this->yyidx + 0]->minor); - break; - case 127: -#line 706 "parser.php.lemon" - { - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_ARRAY, null, null, null, $this->status->getState()); - $this->yy_destructor(85, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(86, $this->yystack[$this->yyidx + 0]->minor); - } -#line 2603 "parser.php.php" - break; - case 128: -#line 710 "parser.php.lemon" - { - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_ARRAY, $this->yystack[$this->yyidx + -1]->minor, null, null, $this->status->getState()); - $this->yy_destructor(85, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(86, $this->yystack[$this->yyidx + 0]->minor); - } -#line 2612 "parser.php.php" - break; - case 130: -#line 718 "parser.php.lemon" - { - phvolt_ret_expr($this->output, Compiler::PHVOLT_T_TERNARY, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -4]->minor, $this->status->getState()); - $this->yy_destructor(3, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(4, $this->yystack[$this->yyidx + -1]->minor); - } -#line 2621 "parser.php.php" - break; - case 131: -#line 722 "parser.php.lemon" - { - phvolt_ret_slice($this->output, $this->yystack[$this->yyidx + -4]->minor, null, $this->yystack[$this->yyidx + -1]->minor, $this->status->getState()); - $this->yy_destructor(24, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(4, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(50, $this->yystack[$this->yyidx + 0]->minor); - } -#line 2631 "parser.php.php" - break; - case 132: -#line 726 "parser.php.lemon" - { - phvolt_ret_slice($this->output, $this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, null, $this->status->getState()); - $this->yy_destructor(24, $this->yystack[$this->yyidx + -3]->minor); - $this->yy_destructor(4, $this->yystack[$this->yyidx + -1]->minor); - $this->yy_destructor(50, $this->yystack[$this->yyidx + 0]->minor); - } - break; - case 133: - phvolt_ret_slice($this->output, $this->yystack[$this->yyidx + -5]->minor, $this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->status->getState()); - $this->yy_destructor(24, $this->yystack[$this->yyidx + -4]->minor); - $this->yy_destructor(4, $this->yystack[$this->yyidx + -2]->minor); - $this->yy_destructor(50, $this->yystack[$this->yyidx + 0]->minor); - break; - case 138: - case 146: - $this->output = phvolt_ret_named_item( - $this->yystack[$this->yyidx - 2]->minor, - $this->yystack[$this->yyidx]->minor, - $this->status->getState(), - ); - $this->yy_destructor(4, $this->yystack[$this->yyidx + -1]->minor); - break; - case 139: - case 145: - $this->output = phvolt_ret_named_item( - null, - $this->yystack[$this->yyidx + 0]->minor, - $this->status->getState(), - ); - break; - case 141: - phvolt_ret_func_call( - $this->output, - $this->yystack[$this->yyidx - 3]->minor, - $this->yystack[$this->yyidx - 1]->minor, - $this->status->getState(), - ); - - $this->yy_destructor(29, $this->yystack[$this->yyidx - 2]->minor); - $this->yy_destructor(52, $this->yystack[$this->yyidx]->minor); - break; - case 142: - phvolt_ret_func_call( - $this->output, - $this->yystack[$this->yyidx + -2]->minor, - null, - $this->status->getState(), - ); - - $this->yy_destructor(29, $this->yystack[$this->yyidx - 1]->minor); - $this->yy_destructor(52, $this->yystack[$this->yyidx]->minor); - break; - } - - /* The next state */ - $yygoto = self::$yyRuleInfo[2 * $yyruleno]; - /* Amount to pop the stack */ - $yysize = self::$yyRuleInfo[2 * $yyruleno + 1]; - - $state_for_reduce = $this->yystack[$this->yyidx - $yysize]->stateno; - - $this->yyidx -= $yysize; - /* The next action */ - $yyact = $this->yy_find_reduce_action($state_for_reduce, $yygoto); - - if ($yyact < self::YYNSTATE) { - $this->yy_shift($yyact, $yygoto, $this->output); - } elseif ($yyact == self::YYNSTATE + self::YYNRULE + 1) { - $this->yy_accept(); - } - } - - /** - ** The following code executes when the parse fails - */ - private function yy_parse_failed(): void - { - if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%sFail!\n", $this->yyTracePrompt); - } - - while ($this->yyidx >= 0) { - $this->yy_pop_parser_stack(); - } - } - - /** - * The following code executes when a syntax error first occurs. - */ - private function yy_syntax_error(): void - { - $error_str = ''; - $token_name = null; - $tokens = \Phalcon\Volt\Tokens::$names; - $active_token = $this->status->getState()->getActiveToken(); - - if ($this->status->getState()->getStartLength()) { - if ($active_token) { - if (in_array($active_token, $tokens)) { - $token_name = array_search($active_token, $tokens); - } - } - - $error_str .= "Syntax error, unexpected token "; - if (!$token_name) { - $error_str .= "UNKNOWN"; - } else { - $error_str .= $token_name; - } - - $tokenValue = $this->status->getToken()->value ?? $this->status->getLastTokenValue(); - $tokenValue = $tokenValue !== null ? trim($tokenValue) : null; - if ($tokenValue) { - $error_str .= "(" . $tokenValue . ")"; - } - - $error_str .= " in "; - $error_str .= $this->status->getState()->getActiveFile(); - $error_str .= " on line " . $this->status->getState()->getActiveLine(); - } else { - $error_str .= "Syntax error, unexpected EOF in " . $this->status->getState()->getActiveFile(); - - /* Report unclosed 'if' blocks */ - if (($this->status->getState()->getIfLevel() + $this->status->getState()->getOldIfLevel()) > 0) { - if (($this->status->getState()->getIfLevel() + $this->status->getState()->getOldIfLevel()) == 1) { - $error_str .= ", there is one 'if' block without close"; - } else { - $error_str .= ", there are "; - $error_str .= $this->status->getState()->getIfLevel() + $this->status->getState()->getOldIfLevel(); - $error_str .= " 'if' blocks without close"; - } - } - - /* Report unclosed 'for' blocks */ - if ($this->status->getState()->getForLevel() > 0) { - if ($this->status->getState()->getForLevel() == 1) { - $error_str .= ", there is one 'for' block without close"; - } else { - $error_str .= ", there are " . $this->status->getState()->getIfLevel() . " 'for' blocks without close"; - } - } - - /* Report unclosed 'switch' blocks */ - if ($this->status->getState()->getSwitchLevel() > 0) { - $error_str .= ", there is a 'switch' block without 'endswitch'"; - } - } - - if ($error_str) { - $this->status->setSyntaxError($error_str); - } - - $this->status->setStatus(Status::PHVOLT_PARSING_FAILED); - } - - /* -** The following is executed when the parser accepts -*/ - private function yy_accept(): void - { - if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%sAccept!\n", $this->yyTracePrompt); - } - while ($this->yyidx >= 0) { - $this->yy_pop_parser_stack(); - } - /* Here code is inserted which will be executed whenever the - ** parser accepts */ - } - - /* The main parser program. -** The first argument is a pointer to a structure obtained from -** "phvolt_Alloc" which describes the current state of the parser. -** The second argument is the major token number. The third is -** the minor token. The fourth optional argument is whatever the -** user wants (and specified in the grammar) and is available for -** use by the action routines. -** -** Inputs: -**
    -**
  • A pointer to the parser (an opaque structure.) -**
  • The major token number. -**
  • The minor token number. -**
  • An option argument of a grammar-specified type. -**
-** -** Outputs: -** None. -*/ - public function phvolt_($yymajor, $yyminor = null) - { - $yyerrorhit = 0; /* True if yymajor has invoked an error */ - - /* (re)initialize the parser, if necessary */ - if ($this->yyidx < 0) { - if ($yymajor === 0) { - return; - } - - $this->yyidx = 0; - $this->yyerrcnt = -1; - $ent = new phvolt_yyStackEntry(); - $ent->stateno = 0; - $ent->major = 0; - $this->yystack = array(0 => $ent); - } - $yyendofinput = $yymajor === 0; - - if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%s Input %s\n", $this->yyTracePrompt, self::$yyTokenName[$yymajor]); - } - - do { - $yyact = $this->yy_find_shift_action($yymajor); - if ($yyact < self::YYNSTATE) { - $this->yy_shift($yyact, $yymajor, $yyminor); - $this->yyerrcnt--; - if ($yyendofinput && $this->yyidx >= 0) { - $yymajor = 0; - } else { - $yymajor = self::YYNOCODE; - } - } elseif ($yyact < self::YYNSTATE + self::YYNRULE) { - $this->yy_reduce($yyact - self::YYNSTATE); - } elseif ($yyact == $this->YY_ERROR_ACTION) { - if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%s Syntax Error!\n", $this->yyTracePrompt); - } - if (self::YYERRORSYMBOL) { - /* A syntax error has occurred. - ** The response to an error depends upon whether the - ** grammar defines an error token "ERROR". - ** - ** This is what we do if the grammar does define ERROR: - ** - ** * Call the %syntax_error function. - ** - ** * Begin popping the stack until we enter a state where - ** it is legal to shift the error symbol, then shift - ** the error symbol. - ** - ** * Set the error count to three. - ** - ** * Begin accepting and shifting new tokens. No new error - ** processing will occur until three tokens have been - ** shifted successfully. - ** - */ - if ($this->yyerrcnt <= 0) { - $this->yy_syntax_error(); - } - $yymx = $this->yystack[$this->yyidx]->major; - if ($yymx == self::YYERRORSYMBOL || $yyerrorhit) { - if ($this->yyTraceFILE) { - fprintf( - $this->yyTraceFILE, - "%sDiscard input token %s\n", - $this->yyTracePrompt, - self::$yyTokenName[$yymajor] - ); - } - $this->yy_destructor($yymajor, $yyminor); - $yymajor = self::YYNOCODE; - } else { - while ( - $this->yyidx >= 0 && - $yymx != self::YYERRORSYMBOL && - ($yyact = $this->yy_find_reduce_action( - $this->yystack[$this->yyidx]->stateno, - self::YYERRORSYMBOL - )) >= self::YYNSTATE - ) { - $this->yy_pop_parser_stack(); - } - if ($this->yyidx < 0 || $yymajor == 0) { - $this->yy_destructor($yymajor, $yyminor); - $this->yy_parse_failed(); - $yymajor = self::YYNOCODE; - } elseif ($yymx != self::YYERRORSYMBOL) { - $this->yy_shift($yyact, self::YYERRORSYMBOL, 0); - } - } - $this->yyerrcnt = 3; - $yyerrorhit = 1; - } else { /* YYERRORSYMBOL is not defined */ - /* This is what we do if the grammar does not define ERROR: - ** - ** * Report an error message, and throw away the input token. - ** - ** * If the input token is $, then fail the parse. - ** - ** As before, subsequent error messages are suppressed until - ** three input tokens have been successfully shifted. - */ - if ($this->yyerrcnt <= 0) { - $this->yy_syntax_error(); - } - $this->yyerrcnt = 3; - $this->yy_destructor($yymajor, $yyminor); - if ($yyendofinput) { - $this->yy_parse_failed(); - } - $yymajor = self::YYNOCODE; - } - } else { - $this->yy_accept(); - $yymajor = self::YYNOCODE; - } - } while ($yymajor != self::YYNOCODE && $this->yyidx >= 0); - } -} - -function phvolt_ret_zval_list(&$ret, $list_left = null, $right_list = null): void -{ - $ret = []; - - if ($list_left !== null) { - if (is_array($list_left) && array_key_exists(0, $list_left)) { - foreach ($list_left as $item) { - // Assuming the items are objects or arrays that require referencing - $ret[] = $item; - } - unset($list_left); - } else { - $ret[] = $list_left; - } - } - - $ret[] = $right_list; -} - -function phvolt_ret_if_statement( - &$ret, - $expr, - $true_statements = null, - $false_statements = null, - ?State $state = null, -): void { - $ret = [ - 'type' => Compiler::PHVOLT_T_IF, - 'expr' => $expr, - ]; - - if ($true_statements !== null) { - $ret['true_statements'] = $true_statements; - } - - if ($false_statements !== null) { - $ret['false_statements'] = $false_statements; - } - - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); -} - -function phvolt_ret_elseif_statement(&$ret, $expr, State $state): void -{ - $ret = [ - "type" => Compiler::PHVOLT_T_ELSEIF, - "expr" => $expr, - "file" => $state->getActiveFile(), - "line" => $state->getActiveLine(), - ]; -} - -function phvolt_ret_elsefor_statement(&$ret, State $state): void -{ - $ret = [ - "type" => Compiler::PHVOLT_T_ELSEFOR, - "file" => $state->getActiveFile(), - "line" => $state->getActiveLine(), - ]; -} - -function phvolt_ret_for_statement( - &$ret, - Token $variable, - ?Token $key = null, - array $expr = [], - $if_expr = null, - $block_statements = null, - ?State $state = null, -): void -{ - $ret = [ - "type" => Compiler::PHVOLT_T_FOR, - "variable" => $variable->value, - ]; - - unset($variable); - - if ($key) { - $ret["key"] = $key->value; - unset($key); - } - - $ret["expr"] = $expr; - - if ($if_expr !== null) { - $ret["if_expr"] = $if_expr; - } - - $ret["block_statements"] = $block_statements; - $ret["file"] = $state->getActiveFile(); - $ret["line"] = $state->getActiveLine(); -} - -function phvolt_ret_literal_zval(&$ret, $type, ?Token $token = null, ?State $state = null): void -{ - $ret = [ - 'type' => $type, - ]; - if ($token !== null && $token->value !== null) { - $ret['value'] = $token->value; - } - - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); -} - -function phvolt_ret_named_item(?Token $token = null, array $expr = [], ?State $state = null): array -{ - $ret['expr'] = $expr; - - if ($token !== null && $token->value !== null) { - $ret['name'] = $token->value; - unset($token); - } - - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); - - return $ret; -} - -function phvolt_ret_func_call(&$ret, $expr, ?array $arguments, State $state): void -{ - $ret = [ - 'type' => Compiler::PHVOLT_T_FCALL, - 'name' => $expr, - ]; - - if ($arguments !== null) { - $ret['arguments'] = $arguments; - } - - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); -} - -function phvolt_ret_macro_call_statement(&$ret, $expr, $arguments, $caller, State $state): void -{ - $ret = [ - "type" => Compiler::PHVOLT_T_CALL, - "name" => $expr, - ]; - - if ($arguments !== null) { - $ret["arguments"] = $arguments; - } - - if ($caller !== null) { - $ret["caller"] = $caller; - } - - $ret["file"] = $state->getActiveFile(); - $ret["line"] = $state->getActiveLine(); -} - -function phvolt_ret_echo_statement(&$ret, $expr, State $state): void -{ - $ret = []; - $ret["type"] = Compiler::PHVOLT_T_ECHO; - $ret["expr"] = $expr; - $ret["file"] = $state->getActiveFile(); - $ret["line"] = $state->getActiveLine(); -} - -function phvolt_ret_expr(array &$ret, int|string $type, ?array $left, ?array $right, ?array $ternary, State $state): void -{ - $ret = [ - 'type' => $type, - ]; - - if ($ternary !== null) { - $ret['ternary'] = $ternary; - } - - if ($left !== null) { - $ret['left'] = $left; - } - - if ($right !== null) { - $ret['right'] = $right; - } - - $ret['file'] = $state->getActiveFile(); - $ret["line"] = $state->getActiveLine(); -} - -function phvolt_ret_include_statement(array &$ret, array $path, ?array $params, $state): void -{ - $ret = []; - $ret['type'] = Compiler::PHVOLT_T_INCLUDE; - $ret['path'] = $path; - - if ($params !== null) { - $ret['params'] = $params; - } - - $ret['file'] = $state->getActiveFile(); - $ret["line"] = $state->getActiveLine(); -} - -function phvolt_ret_macro_parameter(array &$ret, Token $variable, ?array $default_value, State $state): void -{ - $ret = []; - $ret['variable'] = $variable->value; - - // Free the variable token memory - unset($variable); - - if ($default_value !== null) { - $ret['default'] = $default_value; - } - - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); -} - -function phvolt_ret_slice(array &$ret, array $left, ?array $start, ?array $end, $state): void -{ - $ret = []; - $ret['type'] = Compiler::PHVOLT_T_SLICE; - $ret['left'] = $left; - - if ($start !== null) { - $ret['start'] = $start; - } - - if ($end !== null) { - $ret['end'] = $end; - } - - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); -} - -function phvolt_ret_switch_statement(array &$ret, array $expr, ?array $case_clauses, State $state): void -{ - $ret = []; - $ret['type'] = Compiler::PHVOLT_T_SWITCH; - $ret['expr'] = $expr; - - if ($case_clauses !== null) { - $ret['case_clauses'] = $case_clauses; - } - - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); -} - -function phvolt_ret_case_clause(array &$ret, ?array $expr, State $state): void -{ - $ret = []; - - if ($expr !== null) { - $ret['type'] = Compiler::PHVOLT_T_CASE; - $ret['expr'] = $expr; - } else { - $ret['type'] = Compiler::PHVOLT_T_DEFAULT; - } - - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); -} - -function phvolt_ret_set_statement(array &$ret, array $assignments): void -{ - $ret = []; - $ret['type'] = Compiler::PHVOLT_T_SET; - $ret['assignments'] = $assignments; -} - -function phvolt_ret_set_assignment(array &$ret, array $assignable_expr, mixed $operator, array $expr, State $state): void -{ - $ret = [ - 'variable' => $assignable_expr, - 'op' => $operator, - 'expr' => $expr, - 'file' => $state->getActiveFile(), - 'line' => $state->getActiveLine(), - ]; -} - -function phvolt_ret_continue_statement(array &$ret, State $state): void -{ - $ret = []; - $ret['type'] = Compiler::PHVOLT_T_CONTINUE; - - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); -} - -function phvolt_ret_macro_statement(array &$ret, Token $macro_name, ?array $parameters, array $block_statements, State $state): void -{ - $ret = []; - $ret['type'] = Compiler::PHVOLT_T_MACRO; - - $ret['name'] = $macro_name->value; - unset($macro_name); - - if ($parameters !== null) { - $ret['parameters'] = $parameters; - } - - if (!empty($block_statements)) { - $ret['block_statements'] = $block_statements; - } - - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); -} - -function phvolt_ret_break_statement(array &$ret, State $state): void -{ - $ret = []; - $ret['type'] = Compiler::PHVOLT_T_BREAK; - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); -} - -function phvolt_ret_empty_statement(array &$ret, State $state): void -{ - $ret = []; - $ret['type'] = Compiler::PHVOLT_T_EMPTY_STATEMENT; - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); -} - -function phvolt_ret_block_statement(array &$ret, Token $name, ?array $block_statements, State $state): void -{ - $ret = []; - $ret['type'] = Compiler::PHVOLT_T_BLOCK; - - $ret['name'] = $name->value; - unset($name); - - if ($block_statements !== null) { - $ret['block_statements'] = $block_statements; - } - - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); -} - -function phvolt_ret_extends_statement(array &$ret, mixed $path, State $state): void -{ - $ret = [ - 'type' => Compiler::PHVOLT_T_EXTENDS, - 'path' => $path, - 'file' => $state->getActiveFile(), - 'line' => $state->getActiveLine(), - ]; -} - -function phvolt_ret_do_statement(array &$ret, mixed $expr, State $state): void -{ - $ret = []; - $ret['type'] = Compiler::PHVOLT_T_DO; - $ret['expr'] = $expr; - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); -} - -function phvolt_ret_return_statement(array &$ret, mixed $expr, State $state): void -{ - $ret = []; - $ret['type'] = Compiler::PHVOLT_T_RETURN; - $ret['expr'] = $expr; - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); -} - -function phvolt_ret_autoescape_statement(array &$ret, int $enable, mixed $block_statements, State $state): void -{ - $ret = []; - $ret['type'] = Compiler::PHVOLT_T_AUTOESCAPE; - $ret['enable'] = $enable; - $ret['block_statements'] = $block_statements; - $ret['file'] = $state->getActiveFile(); - $ret['line'] = $state->getActiveLine(); -} diff --git a/resources/phpstan-baseline.neon b/resources/phpstan-baseline.neon index 126784e..e19f327 100644 --- a/resources/phpstan-baseline.neon +++ b/resources/phpstan-baseline.neon @@ -780,12 +780,6 @@ parameters: count: 1 path: ../src/Compiler.php - - - message: '#^Property Phalcon\\Volt\\Tokens\:\:\$names type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: ../src/Tokens.php - - message: '#^Cannot cast mixed to string\.$#' identifier: cast.string diff --git a/resources/phpunit.xml b/resources/phpunit.xml index 738f0d8..ca3fd11 100644 --- a/resources/phpunit.xml +++ b/resources/phpunit.xml @@ -16,8 +16,5 @@ ../src - - files/parser.php - diff --git a/src/Parser/Ast.php b/src/Parser/Ast.php new file mode 100644 index 0000000..ef0c999 --- /dev/null +++ b/src/Parser/Ast.php @@ -0,0 +1,402 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Volt\Parser; + +use Phalcon\Volt\Compiler\Opcode; + +/** + * Builds the intermediate representation (nested arrays) exactly as cphalcon's + * `phvolt_ret_*` helpers do (ext/phalcon/mvc/view/engine/volt/parser.php.inc.h). + * + * Two rules are part of the output format and are what `assertSame()` checks: + * + * - keys appear in the order the C helpers call `add_assoc_*`; + * - an optional key is omitted when absent, never set to null. + * + * Every node except the set statement ends with `file` and `line`; the line is + * the one Lemon stamps when it reduces the rule (see Cursor::reduce()). + */ +final class Ast +{ + public function __construct(private readonly string $file) + { + } + + /** + * @param list> $blockStatements + * + * @return array + */ + public function autoescapeStatement(bool $enable, array $blockStatements, int $line): array + { + return $this->locate( + [ + 'type' => Opcode::AUTOESCAPE->value, + 'enable' => $enable ? 1 : 0, + 'block_statements' => $blockStatements, + ], + $line + ); + } + + /** + * Statements with nothing but a type: break, continue, `{% %}`. + * + * @return array + */ + public function bareStatement(Opcode $type, int $line): array + { + return $this->locate(['type' => $type->value], $line); + } + + /** + * @param list>|null $blockStatements + * + * @return array + */ + public function blockStatement(string $name, ?array $blockStatements, int $line): array + { + $node = ['type' => Opcode::BLOCK->value, 'name' => $name]; + if ($blockStatements !== null) { + $node['block_statements'] = $blockStatements; + } + + return $this->locate($node, $line); + } + + /** + * phvolt_ret_case_clause: `{% case expr %}`, or `{% default %}` when there + * is no expression. + * + * @param array|null $expr + * + * @return array + */ + public function caseClause(?array $expr, int $line): array + { + $node = $expr === null + ? ['type' => Opcode::DEFAULT->value] + : ['type' => Opcode::CASE->value, 'expr' => $expr]; + + return $this->locate($node, $line); + } + + /** + * @return array + */ + public function elseForStatement(int $line): array + { + return $this->locate(['type' => Opcode::ELSEFOR->value], $line); + } + + /** + * @param array $expr + * + * @return array + */ + public function elseIfStatement(array $expr, int $line): array + { + return $this->locate(['type' => Opcode::ELSEIF->value, 'expr' => $expr], $line); + } + + /** + * phvolt_ret_expr: operators and other expression nodes. For a ternary, + * `ternary` holds the condition, `left` the true and `right` the false + * branch. + * + * @param array|null $left + * @param array|null $right + * @param array|null $ternary + * + * @return array + */ + public function expr(Opcode $type, ?array $left, ?array $right, ?array $ternary, int $line): array + { + $node = ['type' => $type->value]; + if ($ternary !== null) { + $node['ternary'] = $ternary; + } + if ($left !== null) { + $node['left'] = $left; + } + if ($right !== null) { + $node['right'] = $right; + } + + return $this->locate($node, $line); + } + + /** + * Statements made of a type and one expression: echo, do, return. + * + * @param array $expr + * + * @return array + */ + public function exprStatement(Opcode $type, array $expr, int $line): array + { + return $this->locate(['type' => $type->value, 'expr' => $expr], $line); + } + + /** + * @param array $path + * + * @return array + */ + public function extendsStatement(array $path, int $line): array + { + return $this->locate(['type' => Opcode::EXTENDS->value, 'path' => $path], $line); + } + + /** + * @param array $expr + * @param array|null $ifExpr + * @param list> $blockStatements + * + * @return array + */ + public function forStatement( + string $variable, + ?string $key, + array $expr, + ?array $ifExpr, + array $blockStatements, + int $line + ): array { + $node = ['type' => Opcode::FOR->value, 'variable' => $variable]; + if ($key !== null) { + $node['key'] = $key; + } + $node['expr'] = $expr; + if ($ifExpr !== null) { + $node['if_expr'] = $ifExpr; + } + $node['block_statements'] = $blockStatements; + + return $this->locate($node, $line); + } + + /** + * @param array $name + * @param list>|null $arguments + * + * @return array + */ + public function functionCall(array $name, ?array $arguments, int $line): array + { + $node = ['type' => Opcode::FCALL->value, 'name' => $name]; + if ($arguments !== null) { + $node['arguments'] = $arguments; + } + + return $this->locate($node, $line); + } + + /** + * @param array $expr + * @param list>|null $trueStatements + * @param list>|null $falseStatements + * + * @return array + */ + public function ifStatement(array $expr, ?array $trueStatements, ?array $falseStatements, int $line): array + { + $node = ['type' => Opcode::IF->value, 'expr' => $expr]; + if ($trueStatements !== null) { + $node['true_statements'] = $trueStatements; + } + if ($falseStatements !== null) { + $node['false_statements'] = $falseStatements; + } + + return $this->locate($node, $line); + } + + /** + * @param array $path + * @param array|null $params + * + * @return array + */ + public function includeStatement(array $path, ?array $params, int $line): array + { + $node = ['type' => Opcode::INCLUDE->value, 'path' => $path]; + if ($params !== null) { + $node['params'] = $params; + } + + return $this->locate($node, $line); + } + + /** + * phvolt_ret_literal_zval: a literal, identifier or raw fragment. `value` + * is omitted for null/true/false and for an empty verbatim block. + * + * @return array + */ + public function literal(Opcode $type, ?string $value, int $line): array + { + $node = ['type' => $type->value]; + if ($value !== null) { + $node['value'] = $value; + } + + return $this->locate($node, $line); + } + + /** + * phvolt_ret_macro_call_statement (`{% call %}`). + * + * @param array $name + * @param list>|null $arguments + * @param list>|null $caller + * + * @return array + */ + public function macroCallStatement(array $name, ?array $arguments, ?array $caller, int $line): array + { + $node = ['type' => Opcode::CALL->value, 'name' => $name]; + if ($arguments !== null) { + $node['arguments'] = $arguments; + } + if ($caller !== null) { + $node['caller'] = $caller; + } + + return $this->locate($node, $line); + } + + /** + * @param array|null $default + * + * @return array + */ + public function macroParameter(string $variable, ?array $default, int $line): array + { + $node = ['variable' => $variable]; + if ($default !== null) { + $node['default'] = $default; + } + + return $this->locate($node, $line); + } + + /** + * @param list>|null $parameters + * @param list> $blockStatements + * + * @return array + */ + public function macroStatement(string $name, ?array $parameters, array $blockStatements, int $line): array + { + $node = ['type' => Opcode::MACRO->value, 'name' => $name]; + if ($parameters !== null) { + $node['parameters'] = $parameters; + } + $node['block_statements'] = $blockStatements; + + return $this->locate($node, $line); + } + + /** + * phvolt_ret_named_item: an array item or call argument. It has no `type`. + * + * @param array $expr + * + * @return array + */ + public function namedItem(?string $name, array $expr, int $line): array + { + $node = ['expr' => $expr]; + if ($name !== null) { + $node['name'] = $name; + } + + return $this->locate($node, $line); + } + + /** + * phvolt_ret_set_assignment: no `type`; `op` is the assignment opcode. + * + * @param array $variable + * @param array $expr + * + * @return array + */ + public function setAssignment(array $variable, Opcode $operator, array $expr, int $line): array + { + return $this->locate(['variable' => $variable, 'op' => $operator->value, 'expr' => $expr], $line); + } + + /** + * phvolt_ret_set_statement: the only node without `file` and `line`. + * + * @param list> $assignments + * + * @return array + */ + public function setStatement(array $assignments): array + { + return ['type' => Opcode::SET->value, 'assignments' => $assignments]; + } + + /** + * @param array $left + * @param array|null $start + * @param array|null $end + * + * @return array + */ + public function slice(array $left, ?array $start, ?array $end, int $line): array + { + $node = ['type' => Opcode::SLICE->value, 'left' => $left]; + if ($start !== null) { + $node['start'] = $start; + } + if ($end !== null) { + $node['end'] = $end; + } + + return $this->locate($node, $line); + } + + /** + * @param array $expr + * @param list>|null $caseClauses + * + * @return array + */ + public function switchStatement(array $expr, ?array $caseClauses, int $line): array + { + $node = ['type' => Opcode::SWITCH->value, 'expr' => $expr]; + if ($caseClauses !== null) { + $node['case_clauses'] = $caseClauses; + } + + return $this->locate($node, $line); + } + + /** + * @param array $node + * + * @return array + */ + private function locate(array $node, int $line): array + { + $node['file'] = $this->file; + $node['line'] = $line; + + return $node; + } +} diff --git a/src/Parser/Cursor.php b/src/Parser/Cursor.php new file mode 100644 index 0000000..765d9d7 --- /dev/null +++ b/src/Parser/Cursor.php @@ -0,0 +1,137 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Volt\Parser; + +use Phalcon\Volt\Compiler\Opcode; +use Phalcon\Volt\Exception; +use Phalcon\Volt\Scanner\Token; + +use function fwrite; +use function is_resource; + +/** + * The parser's view of the token stream: one token of lookahead plus an + * emulation of the Lemon parser stack that cphalcon uses. + * + * cphalcon's parser is an LALR(1) automaton with a fixed 100-entry stack + * (parser.c: VVSTACKDEPTH). The recursive-descent parser reproduces it by + * calling shift() for every terminal Lemon would shift and reduce() exactly + * once per grammar rule, at the point the rule's node is built: + * + * - shift() pushes one entry and fails closed on overflow, exactly when + * Lemon's vv_shift() would ("nested too deeply"); + * - reduce($n) pops the rule's $n right-hand-side entries and pushes the + * left-hand side; with no empty rules in the grammar this never grows the + * stack, so it never overflows. + * + * Lemon only reduces when the NEXT token has arrived, and its node builders + * stamp the scanner's current line. shift() therefore fetches the next token + * eagerly, and reduce() returns the line at that moment: the line of the token + * that follows the construct. That is cphalcon's (sometimes surprising) line. + */ +final class Cursor +{ + /** + * Lemon's stack holds VVSTACKDEPTH entries including the bottom sentinel. + */ + private const MAX_DEPTH = 99; + + public Token $current; + + private int $depth = 0; + + /** + * @param resource|null $trace + */ + public function __construct(private readonly TokenStream $stream, private readonly mixed $trace = null) + { + $this->current = $stream->next(); + } + + public function atEnd(): bool + { + return $this->current->opcode === 0; + } + + /** + * Shifts the current token if it is $opcode; a syntax error otherwise. + * + * @throws Exception + * + * @phpstan-impure + */ + public function expect(Opcode $opcode): Token + { + if (!$this->is($opcode)) { + throw $this->stream->syntaxError(); + } + + return $this->shift(); + } + + public function is(Opcode $opcode): bool + { + return $this->current->opcode === $opcode->value; + } + + /** + * Reduces a grammar rule with $rhsLength right-hand-side symbols and + * returns the line to stamp on its node. + */ + public function reduce(int $rhsLength): int + { + $this->depth -= $rhsLength - 1; + $this->log('reduce ' . $rhsLength); + + return $this->stream->line(); + } + + /** + * Consumes the current token and fetches the next one. + * + * @throws Exception + * + * @phpstan-impure + */ + public function shift(): Token + { + if ($this->depth >= self::MAX_DEPTH) { + throw $this->stream->stackOverflow(); + } + + $this->depth++; + $token = $this->current; + $this->log('shift ' . $token->opcode . ($token->value !== null ? ' ' . $token->value : '')); + + $this->stream->consumed($token); + $this->current = $this->stream->next(); + + return $token; + } + + /** + * The syntax error for the current token. + */ + public function unexpected(): Exception + { + return $this->stream->syntaxError(); + } + + private function log(string $message): void + { + if (is_resource($this->trace)) { + fwrite($this->trace, $message . "\n"); + } + } +} diff --git a/src/Parser/ExpressionParser.php b/src/Parser/ExpressionParser.php new file mode 100644 index 0000000..cb996eb --- /dev/null +++ b/src/Parser/ExpressionParser.php @@ -0,0 +1,531 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Volt\Parser; + +use Phalcon\Volt\Compiler\Opcode; +use Phalcon\Volt\Exception; + +/** + * Volt expressions by precedence climbing, resolving every shift/reduce choice + * the way cphalcon's Lemon grammar does (parser.php.lemon). + * + * The precedence levels are copied from the grammar's declarations + * (lines 22-36, later lines bind tighter): + * + * 3 ? : left 9 + - ~ left + * 4 .. left 10 [ right + * 5 and or left 11 | left + * 6 in left 12 not / ! right + * 7 is == != < > left 13 ++ -- left + * <= >= === !== 14 ( right + * 8 * / % left 15 . left + * + * Note `* / %` binding LOOSER than `+ - ~`, `!` binding tighter than `[` and + * `|`, and `not in` (level 12) binding much tighter than `in` (level 6). These + * are cphalcon's behaviour and are reproduced, not corrected. + * + * A rule takes the precedence of its left-most terminal that has one (Lemon's + * rule), so `a ** b` / `a // b` are level 8, `a not in b` and `!a` are level + * 12, `-a` / `+a` are level 9 and the ternary is level 3. With a rule of level + * p pending, a lookahead of level q is shifted iff q > p, or q == p and the + * lookahead is right-associative; otherwise the pending rule is reduced first. + * At the top of an expression nothing is pending and every operator shifts. + */ +final class ExpressionParser +{ + public function __construct(private readonly Cursor $cursor, private readonly Ast $ast) + { + } + + private static function isRightAssociative(int $opcode): bool + { + return $opcode === Opcode::SBRACKET_OPEN->value + || $opcode === Opcode::NOT->value + || $opcode === Opcode::PARENTHESES_OPEN->value; + } + + /** + * Precedence level of a token that can follow an expression; null for + * every token that ends one (`,` `:` `)` `%}` ... - their declared + * precedence never decides a conflict). + */ + private static function level(int $opcode): ?int + { + return match ($opcode) { + Opcode::QUESTION->value => 3, + Opcode::RANGE->value => 4, + Opcode::AND->value, Opcode::OR->value => 5, + Opcode::IN->value => 6, + Opcode::IS->value, + Opcode::EQUALS->value, + Opcode::NOTEQUALS->value, + Opcode::LESS->value, + Opcode::GREATER->value, + Opcode::GREATEREQUAL->value, + Opcode::LESSEQUAL->value, + Opcode::IDENTICAL->value, + Opcode::NOTIDENTICAL->value => 7, + Opcode::DIV->value, Opcode::MUL->value, Opcode::MOD->value => 8, + Opcode::ADD->value, Opcode::SUB->value, Opcode::CONCAT->value => 9, + Opcode::SBRACKET_OPEN->value => 10, + Opcode::PIPE->value => 11, + Opcode::NOT->value => 12, + Opcode::INCR->value, Opcode::DECR->value => 13, + Opcode::PARENTHESES_OPEN->value => 14, + Opcode::DOT->value => 15, + default => null, + }; + } + + /** + * Extends an already-reduced expression with the operators that follow it. + * + * @param array $left + * + * @return array + * + * @throws Exception + */ + public function continue(array $left, ?int $pending): array + { + while ($this->shifts($pending)) { + $left = $this->parseOperator($left); + } + + return $left; + } + + /** + * expr, with a rule of precedence $pending waiting for it (null when + * nothing is pending). + * + * @return array + * + * @throws Exception + */ + public function parse(?int $pending = null): array + { + return $this->continue($this->parsePrefix(), $pending); + } + + /** + * The expression of `{% call expr(args) %}`. Lemon prefers shifting there, + * so a call written at the top of the expression that is directly followed + * by `%}` belongs to the statement, not to an FCALL node: `{% call a.b(1) %}` + * calls `a.b` with (1), while `{% call a + b(1) %}` is a syntax error. + * Returns the call target and its arguments (null for `()`). + * + * @return array{0: array, 1: list>|null} + * + * @throws Exception + */ + public function parseCallTarget(): array + { + $left = $this->parsePrefix(); + + while (true) { + if ($this->cursor->is(Opcode::PARENTHESES_OPEN)) { + $this->cursor->shift(); + $arguments = $this->cursor->is(Opcode::PARENTHESES_CLOSE) ? null : $this->parseArguments(); + $this->cursor->expect(Opcode::PARENTHESES_CLOSE); + + if ($this->cursor->is(Opcode::CLOSE_DELIMITER)) { + return [$left, $arguments]; + } + + $line = $this->cursor->reduce($arguments === null ? 3 : 4); + $left = $this->ast->functionCall($left, $arguments, $line); + + continue; + } + + if (!$this->shifts(null)) { + throw $this->cursor->unexpected(); + } + + $left = $this->parseOperator($left); + } + } + + /** + * Parses the right operand of a binary rule and reduces it. + * + * @param array $left + * + * @return array + * + * @throws Exception + */ + private function binary(Opcode $type, array $left, int $precedence, int $rhsLength): array + { + $right = $this->parse($precedence); + + return $this->ast->expr($type, $left, $right, null, $this->cursor->reduce($rhsLength)); + } + + /** + * After `expr [`: an access `[expr]` or a slice `[a:b]` / `[:b]` / `[a:]`, + * whose offsets can only be an integer or an identifier. + * + * @param array $left + * + * @return array + * + * @throws Exception + */ + private function parseAccessOrSlice(array $left): array + { + if ($this->cursor->is(Opcode::COLON)) { + // expr ::= expr [ : slice_offset ] + $this->cursor->shift(); + $end = $this->parseSliceOffset(); + $this->cursor->expect(Opcode::SBRACKET_CLOSE); + + return $this->ast->slice($left, null, $end, $this->cursor->reduce(5)); + } + + $offset = $this->sliceOffsetOpcode(); + if ($offset !== null) { + $token = $this->cursor->shift(); + + if ($this->cursor->is(Opcode::COLON)) { + $start = $this->ast->literal($offset, $token->value, $this->cursor->reduce(1)); + $this->cursor->shift(); + + if ($this->cursor->is(Opcode::SBRACKET_CLOSE)) { + // expr ::= expr [ slice_offset : ] + $this->cursor->shift(); + + return $this->ast->slice($left, $start, null, $this->cursor->reduce(5)); + } + + // expr ::= expr [ slice_offset : slice_offset ] + $end = $this->parseSliceOffset(); + $this->cursor->expect(Opcode::SBRACKET_CLOSE); + + return $this->ast->slice($left, $start, $end, $this->cursor->reduce(6)); + } + + // not a slice after all: the offset is the start of an expression + $literal = $this->ast->literal($offset, $token->value, $this->cursor->reduce(1)); + $index = $this->continue($literal, null); + } else { + $index = $this->parse(); + } + + // expr ::= expr [ expr ] + $this->cursor->expect(Opcode::SBRACKET_CLOSE); + + return $this->ast->expr(Opcode::ARRAYACCESS, $left, $index, null, $this->cursor->reduce(4)); + } + + /** + * argument_list ::= argument_list , argument_item | argument_item + * + * @return list> + * + * @throws Exception + */ + private function parseArguments(): array + { + return $this->parseItems(); + } + + /** + * `[ ... ]` and `{ ... }` both build an ARRAY node. + * + * @return array + * + * @throws Exception + */ + private function parseArray(Opcode $close): array + { + $this->cursor->shift(); + + if ($this->cursor->is($close)) { + // expr ::= [ ] | { } + $this->cursor->shift(); + + return $this->ast->expr(Opcode::ARRAY, null, null, null, $this->cursor->reduce(2)); + } + + // expr ::= [ array_list ] | { array_list } + $items = $this->parseItems(); + $this->cursor->expect($close); + + return $this->ast->expr(Opcode::ARRAY, $items, null, null, $this->cursor->reduce(3)); + } + + /** + * array_item / argument_item ::= STRING : expr | expr + * + * @return array + * + * @throws Exception + */ + private function parseItem(): array + { + if (!$this->cursor->is(Opcode::STRING)) { + $expr = $this->parse(); + + return $this->ast->namedItem(null, $expr, $this->cursor->reduce(1)); + } + + $token = $this->cursor->shift(); + + if ($this->cursor->is(Opcode::COLON)) { + $this->cursor->shift(); + $expr = $this->parse(); + + return $this->ast->namedItem($token->value, $expr, $this->cursor->reduce(3)); + } + + // not a key after all: the string starts an expression + $literal = $this->ast->literal(Opcode::STRING, $token->value, $this->cursor->reduce(1)); + $expr = $this->continue($literal, null); + + return $this->ast->namedItem(null, $expr, $this->cursor->reduce(1)); + } + + /** + * array_list / argument_list (identical shapes), as a loop: the + * left-recursive list keeps one stack entry however long it gets. + * + * @return list> + * + * @throws Exception + */ + private function parseItems(): array + { + $items = [$this->parseItem()]; + $this->cursor->reduce(1); + + while ($this->cursor->is(Opcode::COMMA)) { + $this->cursor->shift(); + $items[] = $this->parseItem(); + $this->cursor->reduce(3); + } + + return $items; + } + + /** + * One infix/postfix operator applied to $left. + * + * @param array $left + * + * @return array + * + * @throws Exception + */ + private function parseOperator(array $left): array + { + $operator = Opcode::from($this->cursor->current->opcode); + $this->cursor->shift(); + + switch ($operator) { + case Opcode::SBRACKET_OPEN: + return $this->parseAccessOrSlice($left); + + case Opcode::PARENTHESES_OPEN: + $arguments = $this->cursor->is(Opcode::PARENTHESES_CLOSE) ? null : $this->parseArguments(); + $this->cursor->expect(Opcode::PARENTHESES_CLOSE); + + // function_call ::= expr ( [argument_list] ) + return $this->ast->functionCall($left, $arguments, $this->cursor->reduce($arguments === null ? 3 : 4)); + + case Opcode::QUESTION: + // expr ::= expr ? expr : expr + $then = $this->parse(); + $this->cursor->expect(Opcode::COLON); + $else = $this->parse(3); + + return $this->ast->expr(Opcode::TERNARY, $then, $else, $left, $this->cursor->reduce(5)); + + case Opcode::INCR: + case Opcode::DECR: + return $this->ast->expr($operator, $left, null, null, $this->cursor->reduce(2)); + + case Opcode::IS: + case Opcode::NOTEQUALS: + $test = $this->testOpcode($operator === Opcode::IS); + if ($test !== null) { + // expr ::= expr IS|NOTEQUALS DEFINED|EMPTY|EVEN|ODD|NUMERIC|SCALAR|ITERABLE + $this->cursor->shift(); + + return $this->ast->expr($test, $left, null, null, $this->cursor->reduce(3)); + } + + return $this->binary($operator, $left, 7, 3); + + case Opcode::MUL: + if ($this->cursor->is(Opcode::MUL)) { + // expr ::= expr TIMES TIMES expr + $this->cursor->shift(); + + return $this->binary(Opcode::POW, $left, 8, 4); + } + + return $this->binary(Opcode::MUL, $left, 8, 3); + + case Opcode::DIV: + if ($this->cursor->is(Opcode::DIV)) { + // expr ::= expr DIVIDE DIVIDE expr (builds a MOD node) + $this->cursor->shift(); + + return $this->binary(Opcode::MOD, $left, 8, 4); + } + + return $this->binary(Opcode::DIV, $left, 8, 3); + + case Opcode::NOT: + // expr ::= expr NOT IN expr + $this->cursor->expect(Opcode::IN); + + return $this->binary(Opcode::NOT_IN, $left, 12, 4); + + default: + // expr ::= expr OP expr + return $this->binary($operator, $left, (int) self::level($operator->value), 3); + } + } + + /** + * A primary expression or a prefix operator. + * + * @return array + * + * @throws Exception + */ + private function parsePrefix(): array + { + $opcode = $this->cursor->current->opcode; + + switch ($opcode) { + case Opcode::SUB->value: + // expr ::= MINUS expr + $this->cursor->shift(); + $operand = $this->parse(9); + + return $this->ast->expr(Opcode::MINUS, null, $operand, null, $this->cursor->reduce(2)); + + case Opcode::ADD->value: + // expr ::= PLUS expr + $this->cursor->shift(); + $operand = $this->parse(9); + + return $this->ast->expr(Opcode::PLUS, null, $operand, null, $this->cursor->reduce(2)); + + case Opcode::NOT->value: + // expr ::= NOT expr + $this->cursor->shift(); + $operand = $this->parse(12); + + return $this->ast->expr(Opcode::NOT, null, $operand, null, $this->cursor->reduce(2)); + + case Opcode::PARENTHESES_OPEN->value: + // expr ::= ( expr ) + $this->cursor->shift(); + $inner = $this->parse(); + $this->cursor->expect(Opcode::PARENTHESES_CLOSE); + + return $this->ast->expr(Opcode::ENCLOSED, $inner, null, null, $this->cursor->reduce(3)); + + case Opcode::SBRACKET_OPEN->value: + return $this->parseArray(Opcode::SBRACKET_CLOSE); + + case Opcode::CBRACKET_OPEN->value: + return $this->parseArray(Opcode::CBRACKET_CLOSE); + + case Opcode::IDENTIFIER->value: + case Opcode::INTEGER->value: + case Opcode::STRING->value: + case Opcode::DOUBLE->value: + case Opcode::NULL->value: + case Opcode::FALSE->value: + case Opcode::TRUE->value: + // expr ::= IDENTIFIER | INTEGER | STRING | DOUBLE | NULL | FALSE | TRUE + $token = $this->cursor->shift(); + + return $this->ast->literal(Opcode::from($opcode), $token->value, $this->cursor->reduce(1)); + + default: + throw $this->cursor->unexpected(); + } + } + + /** + * slice_offset ::= INTEGER | IDENTIFIER + * + * @return array + * + * @throws Exception + */ + private function parseSliceOffset(): array + { + $offset = $this->sliceOffsetOpcode(); + if ($offset === null) { + throw $this->cursor->unexpected(); + } + + $token = $this->cursor->shift(); + + return $this->ast->literal($offset, $token->value, $this->cursor->reduce(1)); + } + + /** + * Whether the current token continues the expression with $pending + * waiting for it. + */ + private function shifts(?int $pending): bool + { + $opcode = $this->cursor->current->opcode; + $level = self::level($opcode); + + if ($level === null) { + return false; + } + + return $pending === null + || $level > $pending + || ($level === $pending && self::isRightAssociative($opcode)); + } + + private function sliceOffsetOpcode(): ?Opcode + { + return match ($this->cursor->current->opcode) { + Opcode::INTEGER->value => Opcode::INTEGER, + Opcode::IDENTIFIER->value => Opcode::IDENTIFIER, + default => null, + }; + } + + /** + * The node type for `is ` / `is not ` when the current token + * is one of the test keywords; null when it starts an operand instead. + */ + private function testOpcode(bool $positive): ?Opcode + { + return match ($this->cursor->current->opcode) { + Opcode::DEFINED->value => $positive ? Opcode::ISSET : Opcode::NOT_ISSET, + Opcode::EMPTY->value => $positive ? Opcode::ISEMPTY : Opcode::NOT_ISEMPTY, + Opcode::EVEN->value => $positive ? Opcode::ISEVEN : Opcode::NOT_ISEVEN, + Opcode::ODD->value => $positive ? Opcode::ISODD : Opcode::NOT_ISODD, + Opcode::NUMERIC->value => $positive ? Opcode::ISNUMERIC : Opcode::NOT_ISNUMERIC, + Opcode::SCALAR->value => $positive ? Opcode::ISSCALAR : Opcode::NOT_ISSCALAR, + Opcode::ITERABLE->value => $positive ? Opcode::ISITERABLE : Opcode::NOT_ISITERABLE, + default => null, + }; + } +} diff --git a/src/Parser/Parser.php b/src/Parser/Parser.php index 41f173c..b7712c1 100644 --- a/src/Parser/Parser.php +++ b/src/Parser/Parser.php @@ -13,197 +13,74 @@ namespace Phalcon\Volt\Parser; -use Phalcon\Volt\Compiler\Opcode as CompilerOpcode; +use Phalcon\Volt\Compiler\Opcode; use Phalcon\Volt\Exception; -use Phalcon\Volt\Scanner\Opcode; -use Phalcon\Volt\Scanner\Scanner; -use Phalcon\Volt\Scanner\ScannerStatus; -use Phalcon\Volt\Scanner\State; -use Phalcon\Volt\Scanner\Token; -use phvolt_Parser; +use function fclose; use function fopen; -use function sprintf; -use function strlen; -use function substr; +/** + * Parses Volt templates into cphalcon's intermediate representation. + * + * A hand-written replacement for the Lemon parser that cphalcon generates from + * ext/phalcon/mvc/view/engine/volt/parser.php.lemon, producing the same output + * for every input: the same AST (key order and types included), the same line + * numbers, the same error messages on the same tokens, and the same "nested + * too deeply" failure at the same depth. Behaviour is pinned against + * ext-phalcon by the parity goldens in tests/fixtures/parity. + * + * Statements are parsed here by recursive descent - one method per grammar + * rule group, each quoting its productions - and expressions by + * ExpressionParser. Every method mirrors the LALR parser exactly: it shifts + * the terminals Lemon shifts and reduces each rule once, with its + * right-hand-side length, when the rule's node is built (see Cursor). + * + * The one deliberate difference from cphalcon is the removed + * `{% cache %}` statement: `cache` and `endcache` are plain identifiers. + */ class Parser { + private Ast $ast; + + private Cursor $cursor; + private bool $debug = false; private string $debugFile = 'volt.txt'; + private ExpressionParser $expressions; + /** - * @return array + * @return array> + * * @throws Exception */ public function parse(string $code, string $templatePath = 'eval code'): array { - if (strlen($code) === 0) { + if ($code === '') { return []; } - $debugHandle = null; - if ($this->debug) { - $debugHandle = fopen($this->debugFile, 'w+'); - } + $trace = $this->debug ? fopen($this->debugFile, 'w+') : null; - $codeLength = strlen($code); - $parserState = new State($code); - $parserState->setActiveFile($templatePath); - $parserStatus = new Status($parserState); - $scanner = new Scanner($parserStatus->getState()); - - $parser = new phvolt_Parser($parserStatus); - $parser->phvolt_Trace($debugHandle); - - $state = $parserStatus->getState(); - $scannerStatus = ScannerStatus::OK; - $prevToken = 0; - - while (($scannerStatus = $scanner->scanForToken()) === ScannerStatus::OK) { - $token = $scanner->getToken(); - $parserStatus->setToken($token); - $state->setStartLength($codeLength - $state->getCursor()); - - $opcode = $token->opcode; - $state->setActiveToken($opcode); - - match ($opcode) { - CompilerOpcode::IGNORE->value => null, - CompilerOpcode::ADD->value => $parser->phvolt_(Opcode::PLUS->value), - CompilerOpcode::SUB->value => $parser->phvolt_(Opcode::MINUS->value), - CompilerOpcode::MUL->value => $parser->phvolt_(Opcode::TIMES->value), - CompilerOpcode::DIV->value => $parser->phvolt_(Opcode::DIVIDE->value), - CompilerOpcode::MOD->value => $parser->phvolt_(Opcode::MOD->value), - CompilerOpcode::AND->value => $parser->phvolt_(Opcode::AND->value), - CompilerOpcode::OR->value => $parser->phvolt_(Opcode::OR->value), - CompilerOpcode::IS->value => $parser->phvolt_(Opcode::IS->value), - CompilerOpcode::EQUALS->value => $parser->phvolt_(Opcode::EQUALS->value), - CompilerOpcode::NOTEQUALS->value => $parser->phvolt_(Opcode::NOTEQUALS->value), - CompilerOpcode::LESS->value => $parser->phvolt_(Opcode::LESS->value), - CompilerOpcode::GREATER->value => $parser->phvolt_(Opcode::GREATER->value), - CompilerOpcode::GREATEREQUAL->value => $parser->phvolt_(Opcode::GREATEREQUAL->value), - CompilerOpcode::LESSEQUAL->value => $parser->phvolt_(Opcode::LESSEQUAL->value), - CompilerOpcode::IDENTICAL->value => $parser->phvolt_(Opcode::IDENTICAL->value), - CompilerOpcode::NOTIDENTICAL->value => $parser->phvolt_(Opcode::NOTIDENTICAL->value), - CompilerOpcode::NOT->value => $parser->phvolt_(Opcode::NOT->value), - CompilerOpcode::DOT->value => $parser->phvolt_(Opcode::DOT->value), - CompilerOpcode::CONCAT->value => $parser->phvolt_(Opcode::CONCAT->value), - CompilerOpcode::RANGE->value => $parser->phvolt_(Opcode::RANGE->value), - CompilerOpcode::PIPE->value => $parser->phvolt_(Opcode::PIPE->value), - CompilerOpcode::COMMA->value => $parser->phvolt_(Opcode::COMMA->value), - CompilerOpcode::COLON->value => $parser->phvolt_(Opcode::COLON->value), - CompilerOpcode::QUESTION->value => $parser->phvolt_(Opcode::QUESTION->value), - CompilerOpcode::PARENTHESES_OPEN->value => $parser->phvolt_(Opcode::PARENTHESES_OPEN->value), - CompilerOpcode::PARENTHESES_CLOSE->value => $parser->phvolt_(Opcode::PARENTHESES_CLOSE->value), - CompilerOpcode::SBRACKET_OPEN->value => $parser->phvolt_(Opcode::SBRACKET_OPEN->value), - CompilerOpcode::SBRACKET_CLOSE->value => $parser->phvolt_(Opcode::SBRACKET_CLOSE->value), - CompilerOpcode::CBRACKET_OPEN->value => $parser->phvolt_(Opcode::CBRACKET_OPEN->value), - CompilerOpcode::CBRACKET_CLOSE->value => $parser->phvolt_(Opcode::CBRACKET_CLOSE->value), - CompilerOpcode::OPEN_DELIMITER->value => $parser->phvolt_(Opcode::OPEN_DELIMITER->value), - CompilerOpcode::CLOSE_DELIMITER->value => $parser->phvolt_(Opcode::CLOSE_DELIMITER->value), - CompilerOpcode::OPEN_EDELIMITER->value => $this->handleOpenEdelimiter($parser, $parserStatus, $state), - CompilerOpcode::CLOSE_EDELIMITER->value => $parser->phvolt_(Opcode::CLOSE_EDELIMITER->value), - CompilerOpcode::NULL->value => $parser->phvolt_(Opcode::NULL->value), - CompilerOpcode::TRUE->value => $parser->phvolt_(Opcode::TRUE->value), - CompilerOpcode::FALSE->value => $parser->phvolt_(Opcode::FALSE->value), - CompilerOpcode::INTEGER->value => $this->parseWithToken($parser, $token, Opcode::INTEGER), - CompilerOpcode::DOUBLE->value => $this->parseWithToken($parser, $token, Opcode::DOUBLE), - CompilerOpcode::STRING->value => $this->parseWithToken($parser, $token, Opcode::STRING), - CompilerOpcode::IDENTIFIER->value => $this->parseWithToken($parser, $token, Opcode::IDENTIFIER), - CompilerOpcode::IF->value => $this->handleIf($parser, $parserStatus, $state), - CompilerOpcode::ELSE->value => $state->getIfLevel() === 0 && $state->getForLevel() > 0 - ? $parser->phvolt_(Opcode::ELSEFOR->value) - : $parser->phvolt_(Opcode::ELSE->value), - CompilerOpcode::ELSEFOR->value => $parser->phvolt_(Opcode::ELSEFOR->value), - CompilerOpcode::ELSEIF->value => $this->handleElseif($parser, $parserStatus, $state), - CompilerOpcode::ENDIF->value => $this->handleEndif($parser, $state), - CompilerOpcode::FOR->value => $this->handleFor($parser, $parserStatus, $state), - CompilerOpcode::IN->value => $parser->phvolt_(Opcode::IN->value), - CompilerOpcode::ENDFOR->value => $this->handleEndfor($parser, $state), - CompilerOpcode::SWITCH->value => $this->handleSwitch($parser, $parserStatus, $state), - CompilerOpcode::CASE->value => $this->handleCase($parser, $parserStatus), - CompilerOpcode::DEFAULT->value => $this->handleDefault( - $parser, - $parserStatus, - $token, - $state, - $prevToken - ), - CompilerOpcode::ENDSWITCH->value => $this->handleEndswitch($parser, $parserStatus, $state), - CompilerOpcode::RAW_FRAGMENT->value => $this->handleRawFragment( - $parser, - $parserStatus, - $token, - $state - ), - CompilerOpcode::SET->value => $this->handleSet($parser, $parserStatus, $state), - CompilerOpcode::ASSIGN->value => $parser->phvolt_(Opcode::ASSIGN->value), - CompilerOpcode::ADD_ASSIGN->value => $parser->phvolt_(Opcode::ADD_ASSIGN->value), - CompilerOpcode::SUB_ASSIGN->value => $parser->phvolt_(Opcode::SUB_ASSIGN->value), - CompilerOpcode::MUL_ASSIGN->value => $parser->phvolt_(Opcode::MUL_ASSIGN->value), - CompilerOpcode::DIV_ASSIGN->value => $parser->phvolt_(Opcode::DIV_ASSIGN->value), - CompilerOpcode::INCR->value => $parser->phvolt_(Opcode::INCR->value), - CompilerOpcode::DECR->value => $parser->phvolt_(Opcode::DECR->value), - CompilerOpcode::BLOCK->value => $this->handleBlock($parser, $parserStatus, $state), - CompilerOpcode::ENDBLOCK->value => $this->handleEndblock($parser, $state), - CompilerOpcode::MACRO->value => $this->handleMacro($parser, $parserStatus, $state), - CompilerOpcode::ENDMACRO->value => $this->handleEndmacro($parser, $state), - CompilerOpcode::CALL->value => $parser->phvolt_(Opcode::CALL->value), - CompilerOpcode::ENDCALL->value => $parser->phvolt_(Opcode::ENDCALL->value), - CompilerOpcode::VERBATIM->value => $parser->phvolt_(Opcode::VERBATIM->value), - CompilerOpcode::ENDVERBATIM->value => $parser->phvolt_(Opcode::ENDVERBATIM->value), - CompilerOpcode::INCLUDE->value => $parser->phvolt_(Opcode::INCLUDE->value), - CompilerOpcode::WITH->value => $parser->phvolt_(Opcode::WITH->value), - CompilerOpcode::DEFINED->value => $parser->phvolt_(Opcode::DEFINED->value), - CompilerOpcode::EMPTY->value => $parser->phvolt_(Opcode::EMPTY->value), - CompilerOpcode::EVEN->value => $parser->phvolt_(Opcode::EVEN->value), - CompilerOpcode::ODD->value => $parser->phvolt_(Opcode::ODD->value), - CompilerOpcode::NUMERIC->value => $parser->phvolt_(Opcode::NUMERIC->value), - CompilerOpcode::SCALAR->value => $parser->phvolt_(Opcode::SCALAR->value), - CompilerOpcode::ITERABLE->value => $parser->phvolt_(Opcode::ITERABLE->value), - CompilerOpcode::DO->value => $parser->phvolt_(Opcode::DO->value), - CompilerOpcode::RETURN->value => $parser->phvolt_(Opcode::RETURN->value), - CompilerOpcode::AUTOESCAPE->value => $parser->phvolt_(Opcode::AUTOESCAPE->value), - CompilerOpcode::ENDAUTOESCAPE->value => $parser->phvolt_(Opcode::ENDAUTOESCAPE->value), - CompilerOpcode::BREAK->value => $parser->phvolt_(Opcode::BREAK->value), - CompilerOpcode::CONTINUE->value => $parser->phvolt_(Opcode::CONTINUE->value), - CompilerOpcode::EXTENDS->value => $this->handleExtends($parser, $parserStatus, $state), - default => $this->handleUnknownOpcode($parserStatus, $opcode), - }; - - if ($parserStatus->getStatus() !== Status::PHVOLT_PARSING_OK) { - break; - } + try { + $this->ast = new Ast($templatePath); + $this->cursor = new Cursor(new TokenStream($code, $templatePath), $trace ?: null); + $this->expressions = new ExpressionParser($this->cursor, $this->ast); - // whitespace inside delimiters arrives as IGNORE; skip it - if ($opcode !== CompilerOpcode::IGNORE->value) { - $prevToken = $opcode; + return $this->parseProgram(); + } finally { + if ($trace) { + fclose($trace); } - - $state->setEnd($state->getStart()); } - - if ( - $scannerStatus === ScannerStatus::ERR || - $scannerStatus === ScannerStatus::IMPOSSIBLE - ) { - throw new Exception($this->createScannerErrorMessage($parserStatus)); - } elseif ($scannerStatus === ScannerStatus::EOF) { - $parser->phvolt_(0); - } - - $state->setStartLength(0); - $state->setActiveToken(null); - - if ($parserStatus->getStatus() !== Status::PHVOLT_PARSING_OK) { - throw new Exception($parserStatus->getSyntaxError() ?? ''); - } - - return $parser->getOutput(); } + /** + * Writes a shift/reduce trace of the next parse to the debug file. + * + * @deprecated Kept for backwards compatibility; the trace format is not stable. + */ public function setDebug(bool $debug): static { $this->debug = $debug; @@ -211,6 +88,9 @@ public function setDebug(bool $debug): static return $this; } + /** + * @deprecated Kept for backwards compatibility; see setDebug(). + */ public function setDebugFile(string $debugFile): static { $this->debugFile = $debugFile; @@ -218,310 +98,700 @@ public function setDebugFile(string $debugFile): static return $this; } - private function createErrorMessage(Status $parserStatus, string $message): void + /** + * After parseStatementList(): the expected terminator keyword, then `%}`. + * When the list stopped at anything else, that token is the syntax error. + * + * @throws Exception + */ + private function closeList(Opcode $keyword, ?Opcode $terminator): void { - $length = 128 + strlen($parserStatus->getState()->getActiveFile()); - $str = sprintf( - "%s in %s on line %d", - $message, - $parserStatus->getState()->getActiveFile(), - $parserStatus->getState()->getActiveLine(), - ); + if ($terminator !== $keyword) { + throw $this->cursor->unexpected(); + } - $parserStatus->setSyntaxError(substr($str, 0, $length)); + $this->closeTag(); } - private function createScannerErrorMessage(Status $parserStatus): string + /** + * Shifts the current terminator keyword and the `%}` after it. + * + * @throws Exception + */ + private function closeTag(): void { - $state = $parserStatus->getState(); + $this->cursor->shift(); + $this->cursor->expect(Opcode::CLOSE_DELIMITER); + } - if ($state->getStartLength() > 0) { - if ($state->getStartLength() > 16) { - $part = substr($state->getRawBuffer(), $state->getCursor(), 16); + /** + * `{% KEYWORD %}` in full, when no statement may come first. + * + * @throws Exception + */ + private function expectEndTag(Opcode $keyword): void + { + $this->cursor->expect(Opcode::OPEN_DELIMITER); + $this->cursor->expect($keyword); + $this->cursor->expect(Opcode::CLOSE_DELIMITER); + } - return sprintf( - "Scanning error before '%s...' in %s on line %d", - $part, - $state->getActiveFile(), - $state->getActiveLine(), - ); + /** + * assignable_expr ::= IDENTIFIER + * | assignable_expr [ expr ] + * | assignable_expr . assignable_expr + * + * `.` (level 15, left) always reduces before a following `[` or `.`, so + * its right-hand side is a single identifier: `a.b.c[0]` is + * `((a.b).c)[0]`. + * + * @return array + * + * @throws Exception + */ + private function parseAssignable(): array + { + $token = $this->cursor->expect(Opcode::IDENTIFIER); + $variable = $this->ast->literal(Opcode::IDENTIFIER, $token->value, $this->cursor->reduce(1)); + + while (true) { + if ($this->cursor->is(Opcode::SBRACKET_OPEN)) { + $this->cursor->shift(); + $index = $this->expressions->parse(); + $this->cursor->expect(Opcode::SBRACKET_CLOSE); + $variable = $this->ast->expr(Opcode::ARRAYACCESS, $variable, $index, null, $this->cursor->reduce(4)); + } elseif ($this->cursor->is(Opcode::DOT)) { + $this->cursor->shift(); + $token = $this->cursor->expect(Opcode::IDENTIFIER); + $property = $this->ast->literal(Opcode::IDENTIFIER, $token->value, $this->cursor->reduce(1)); + $variable = $this->ast->expr(Opcode::DOT, $variable, $property, null, $this->cursor->reduce(3)); + } else { + return $variable; } - - return sprintf( - "Scanning error before '%s' in %s on line %d", - $state->getStart(), - $state->getActiveFile(), - $state->getActiveLine(), - ); } + } - return sprintf( - "Scanning error near to EOF in %s", - $state->getActiveFile(), - ); + /** + * @return array + * + * @throws Exception + */ + private function parseAssignment(): array + { + $variable = $this->parseAssignable(); + + $operator = match ($this->cursor->current->opcode) { + Opcode::ASSIGN->value => Opcode::ASSIGN, + Opcode::ADD_ASSIGN->value => Opcode::ADD_ASSIGN, + Opcode::SUB_ASSIGN->value => Opcode::SUB_ASSIGN, + Opcode::MUL_ASSIGN->value => Opcode::MUL_ASSIGN, + Opcode::DIV_ASSIGN->value => Opcode::DIV_ASSIGN, + default => throw $this->cursor->unexpected(), + }; + + $this->cursor->shift(); + $expr = $this->expressions->parse(); + + return $this->ast->setAssignment($variable, $operator, $expr, $this->cursor->reduce(3)); } - private function handleBlock(phvolt_Parser $parser, Status $parserStatus, State $state): void + /** + * autoescape_statement ::= {% AUTOESCAPE FALSE|TRUE %} statement_list {% ENDAUTOESCAPE %} + * + * @return array + * + * @throws Exception + */ + private function parseAutoescape(): array { - if ($state->getBlockLevel() > 0) { - $this->createErrorMessage($parserStatus, 'Embedding blocks into other blocks is not supported'); - $parserStatus->setStatus(Status::PHVOLT_PARSING_FAILED); + $this->cursor->shift(); - return; + if (!$this->cursor->is(Opcode::TRUE) && !$this->cursor->is(Opcode::FALSE)) { + throw $this->cursor->unexpected(); } - $state->incrementBlockLevel(); - $parser->phvolt_(Opcode::BLOCK->value); + $enable = $this->cursor->shift()->opcode === Opcode::TRUE->value; + $this->cursor->expect(Opcode::CLOSE_DELIMITER); + $statements = $this->parseBody(Opcode::ENDAUTOESCAPE); + + return $this->ast->autoescapeStatement($enable, $statements, $this->cursor->reduce(8)); + } + + /** + * break_statement ::= {% BREAK %} + * continue_statement ::= {% CONTINUE %} + * elsefor_statement ::= {% ELSEFOR %} + * case_clause ::= {% DEFAULT %} + * + * @return array + * + * @throws Exception + */ + private function parseBare(Opcode $type): array + { + $this->cursor->shift(); + $this->cursor->expect(Opcode::CLOSE_DELIMITER); + $line = $this->cursor->reduce(3); + + return $type === Opcode::DEFAULT + ? $this->ast->caseClause(null, $line) + : $this->ast->bareStatement($type, $line); } - private function handleCase(phvolt_Parser $parser, Status $parserStatus): void + /** + * block_statement ::= {% BLOCK IDENTIFIER %} statement_list {% ENDBLOCK %} + * | {% BLOCK IDENTIFIER %} {% ENDBLOCK %} + * + * @return array + * + * @throws Exception + */ + private function parseBlock(): array { - if ($parserStatus->getState()->getSwitchLevel() === 0) { - $this->createErrorMessage($parserStatus, 'Unexpected CASE'); - $parserStatus->setStatus(Status::PHVOLT_PARSING_FAILED); + $this->cursor->shift(); + $name = (string) $this->cursor->expect(Opcode::IDENTIFIER)->value; + $this->cursor->expect(Opcode::CLOSE_DELIMITER); - return; - } + [$statements, $terminator] = $this->parseStatementList([Opcode::ENDBLOCK], [Opcode::ENDBLOCK]); + $this->closeList(Opcode::ENDBLOCK, $terminator); - $parser->phvolt_(Opcode::CASE->value); + return $this->ast->blockStatement($name, $statements, $this->cursor->reduce($statements === null ? 7 : 8)); } /** - * "default" is the {% default %} clause only when it is inside a switch - * and directly follows the opening delimiter; anywhere else (e.g. the - * |default() filter) it is a plain identifier. + * A body that must contain at least one statement, then `{% END... %}`. + * + * @return list> + * + * @throws Exception */ - private function handleDefault( - phvolt_Parser $parser, - Status $parserStatus, - Token $token, - State $state, - int $prevToken - ): void { - if ( - $state->getSwitchLevel() !== 0 && - $prevToken === CompilerOpcode::OPEN_DELIMITER->value - ) { - $parser->phvolt_(Opcode::DEFAULT->value); + private function parseBody(Opcode $end): array + { + [$statements, $terminator] = $this->parseStatementList([], [$end]); - return; + if ($statements === null) { + throw $this->cursor->unexpected(); } - $newToken = new Token(CompilerOpcode::IDENTIFIER->value, $token->value); - $parser->phvolt_(Opcode::IDENTIFIER->value, $newToken); + $this->closeList($end, $terminator); + + return $statements; } - private function handleElseif(phvolt_Parser $parser, Status $parserStatus, State $state): void + /** + * macro_call_statement ::= {% CALL expr ( argument_list ) %} statement_list {% ENDCALL %} + * | {% CALL expr ( ) %} {% ENDCALL %} + * + * The call with arguments needs a body and the call without arguments + * must not have one - those are the only two rules. + * + * @return array + * + * @throws Exception + */ + private function parseCall(): array { - if ($state->getIfLevel() === 0) { - $this->createErrorMessage($parserStatus, 'Unexpected ENDIF'); - $parserStatus->setStatus(Status::PHVOLT_PARSING_FAILED); + $this->cursor->shift(); + [$name, $arguments] = $this->expressions->parseCallTarget(); + $this->cursor->expect(Opcode::CLOSE_DELIMITER); - return; + if ($arguments === null) { + $this->expectEndTag(Opcode::ENDCALL); + + return $this->ast->macroCallStatement($name, null, null, $this->cursor->reduce(9)); } - $parser->phvolt_(Opcode::ELSEIF->value); + $caller = $this->parseBody(Opcode::ENDCALL); + + return $this->ast->macroCallStatement($name, $arguments, $caller, $this->cursor->reduce(11)); } - private function handleEndblock(phvolt_Parser $parser, State $state): void + /** + * case_clause ::= {% CASE expr %} + * + * @return array + * + * @throws Exception + */ + private function parseCase(): array { - $state->decrementBlockLevel(); - $parser->phvolt_(Opcode::ENDBLOCK->value); + $expr = $this->parseKeywordExpr(); + + return $this->ast->caseClause($expr, $this->cursor->reduce(4)); } - private function handleEndfor(phvolt_Parser $parser, State $state): void + /** + * echo_statement ::= {{ expr }} + * + * @return array + * + * @throws Exception + */ + private function parseEcho(): array { - $state->decrementBlockLevel(); - $state->decrementForLevel(); - $state->setIfLevel($state->getOldIfLevel()); - $parser->phvolt_(Opcode::ENDFOR->value); + $this->cursor->shift(); + $expr = $this->expressions->parse(); + $this->cursor->expect(Opcode::CLOSE_EDELIMITER); + + return $this->ast->exprStatement(Opcode::ECHO, $expr, $this->cursor->reduce(3)); } - private function handleEndif(phvolt_Parser $parser, State $state): void + /** + * elseif_statement ::= {% ELSEIF expr %} + * + * @return array + * + * @throws Exception + */ + private function parseElseIf(): array { - $state->decrementBlockLevel(); - $state->decrementIfLevel(); - $parser->phvolt_(Opcode::ENDIF->value); + $expr = $this->parseKeywordExpr(); + + return $this->ast->elseIfStatement($expr, $this->cursor->reduce(4)); } - private function handleEndmacro(phvolt_Parser $parser, State $state): void + /** + * empty_statement ::= {% %} + * + * @return array + * + * @throws Exception + */ + private function parseEmpty(): array { - $state->decrementMacroLevel(); - $parser->phvolt_(Opcode::ENDMACRO->value); + $this->cursor->shift(); + + return $this->ast->bareStatement(Opcode::EMPTY_STATEMENT, $this->cursor->reduce(2)); } - private function handleEndswitch(phvolt_Parser $parser, Status $parserStatus, State $state): void + /** + * do_statement ::= {% DO expr %} + * return_statement ::= {% RETURN expr %} + * + * @return array + * + * @throws Exception + */ + private function parseExprStatement(Opcode $type): array { - if ($state->getSwitchLevel() === 0) { - $this->createErrorMessage($parserStatus, 'Unexpected ENDSWITCH'); - $parserStatus->setStatus(Status::PHVOLT_PARSING_FAILED); + $expr = $this->parseKeywordExpr(); - return; - } + return $this->ast->exprStatement($type, $expr, $this->cursor->reduce(4)); + } - $state->decrementBlockLevel(); - $state->setSwitchLevel(0); - $parser->phvolt_(Opcode::ENDSWITCH->value); + /** + * extends_statement ::= {% EXTENDS expr %} + * + * @return array + * + * @throws Exception + */ + private function parseExtends(): array + { + $path = $this->parseKeywordExpr(); + + return $this->ast->extendsStatement($path, $this->cursor->reduce(4)); } - private function handleExtends(phvolt_Parser $parser, Status $parserStatus, State $state): void + /** + * for_statement ::= {% FOR IDENTIFIER IN expr %} statement_list {% ENDFOR %} + * | {% FOR IDENTIFIER IN expr IF expr %} statement_list {% ENDFOR %} + * | {% FOR IDENTIFIER , IDENTIFIER IN expr %} statement_list {% ENDFOR %} + * | {% FOR IDENTIFIER , IDENTIFIER IN expr IF expr %} statement_list {% ENDFOR %} + * + * In the key/value forms the first identifier is the key. + * + * @return array + * + * @throws Exception + */ + private function parseFor(): array { - if ($state->getStatementPosition() !== 1) { - $this->createErrorMessage( - $parserStatus, - 'Extends statement must be placed at the first line in the template' - ); - $parserStatus->setStatus(Status::PHVOLT_PARSING_FAILED); + $this->cursor->shift(); + $variable = (string) $this->cursor->expect(Opcode::IDENTIFIER)->value; + $key = null; + $length = 10; + + if ($this->cursor->is(Opcode::COMMA)) { + $this->cursor->shift(); + $key = $variable; + $variable = (string) $this->cursor->expect(Opcode::IDENTIFIER)->value; + $length += 2; + } + + $this->cursor->expect(Opcode::IN); + $expr = $this->expressions->parse(); + $ifExpr = null; - return; + if ($this->cursor->is(Opcode::IF)) { + $this->cursor->shift(); + $ifExpr = $this->expressions->parse(); + $length += 2; } - $state->setExtendsMode(1); - $parser->phvolt_(Opcode::EXTENDS->value); + $this->cursor->expect(Opcode::CLOSE_DELIMITER); + $statements = $this->parseBody(Opcode::ENDFOR); + + return $this->ast->forStatement($variable, $key, $expr, $ifExpr, $statements, $this->cursor->reduce($length)); } - private function handleFor(phvolt_Parser $parser, Status $parserStatus, State $state): void + /** + * if_statement ::= {% IF expr %} statement_list {% ENDIF %} + * | {% IF expr %} {% ENDIF %} + * | {% IF expr %} statement_list {% ELSE %} statement_list {% ENDIF %} + * | {% IF expr %} statement_list {% ELSE %} {% ENDIF %} + * | {% IF expr %} {% ELSE %} {% ENDIF %} + * + * There is no rule for an empty true branch with a non-empty else. + * + * @return array + * + * @throws Exception + */ + private function parseIf(): array { - if ($state->getExtendsMode() === 1 && $state->getBlockLevel() === 0) { - $this->createErrorMessage($parserStatus, 'Child templates only may contain blocks'); - $parserStatus->setStatus(Status::PHVOLT_PARSING_FAILED); + $expr = $this->parseKeywordExpr(); + + [$true, $terminator] = $this->parseStatementList([Opcode::ENDIF, Opcode::ELSE], [Opcode::ENDIF, Opcode::ELSE]); - return; + if ($terminator === null) { + throw $this->cursor->unexpected(); } - $state->setOldIfLevel($state->getIfLevel()); - $state->setIfLevel(0); - $state->incrementForLevel(); - $state->incrementBlockLevel(); - $parser->phvolt_(Opcode::FOR->value); - } + $this->closeTag(); - private function handleIf(phvolt_Parser $parser, Status $parserStatus, State $state): void - { - if ($state->getExtendsMode() === 1 && $state->getBlockLevel() === 0) { - $this->createErrorMessage($parserStatus, 'Child templates only may contain blocks'); - $parserStatus->setStatus(Status::PHVOLT_PARSING_FAILED); + if ($terminator === Opcode::ENDIF) { + return $this->ast->ifStatement($expr, $true, null, $this->cursor->reduce($true === null ? 7 : 8)); + } - return; + if ($true === null) { + $this->expectEndTag(Opcode::ENDIF); + + return $this->ast->ifStatement($expr, null, null, $this->cursor->reduce(10)); } - $state->incrementIfLevel(); - $state->incrementBlockLevel(); - $parser->phvolt_(Opcode::IF->value); + [$false, $terminator] = $this->parseStatementList([Opcode::ENDIF], [Opcode::ENDIF]); + $this->closeList(Opcode::ENDIF, $terminator); + + return $this->ast->ifStatement($expr, $true, $false, $this->cursor->reduce($false === null ? 11 : 12)); } - private function handleMacro(phvolt_Parser $parser, Status $parserStatus, State $state): void + /** + * include_statement ::= {% INCLUDE expr %} | {% INCLUDE expr WITH expr %} + * + * @return array + * + * @throws Exception + */ + private function parseInclude(): array { - if ($state->getMacroLevel() > 0) { - $this->createErrorMessage($parserStatus, 'Embedding macros into other macros is not allowed'); - $parserStatus->setStatus(Status::PHVOLT_PARSING_FAILED); + $this->cursor->shift(); + $path = $this->expressions->parse(); + $params = null; - return; + if ($this->cursor->is(Opcode::WITH)) { + $this->cursor->shift(); + $params = $this->expressions->parse(); } - $state->incrementMacroLevel(); - $parser->phvolt_(Opcode::MACRO->value); + $this->cursor->expect(Opcode::CLOSE_DELIMITER); + + return $this->ast->includeStatement($path, $params, $this->cursor->reduce($params === null ? 4 : 6)); } - private function handleOpenEdelimiter(phvolt_Parser $parser, Status $parserStatus, State $state): void + /** + * Shifts the statement keyword, then parses `expr %}`. + * + * @return array + * + * @throws Exception + */ + private function parseKeywordExpr(): array { - if ($state->getExtendsMode() === 1 && $state->getBlockLevel() === 0) { - $this->createErrorMessage($parserStatus, 'Child templates only may contain blocks'); - $parserStatus->setStatus(Status::PHVOLT_PARSING_FAILED); + $this->cursor->shift(); + $expr = $this->expressions->parse(); + $this->cursor->expect(Opcode::CLOSE_DELIMITER); + + return $expr; + } - return; + /** + * macro_statement ::= {% MACRO IDENTIFIER ( ) %} statement_list {% ENDMACRO %} + * | {% MACRO IDENTIFIER ( macro_parameters ) %} statement_list {% ENDMACRO %} + * macro_parameters ::= macro_parameters , macro_parameter | macro_parameter + * + * @return array + * + * @throws Exception + */ + private function parseMacro(): array + { + $this->cursor->shift(); + $name = (string) $this->cursor->expect(Opcode::IDENTIFIER)->value; + $this->cursor->expect(Opcode::PARENTHESES_OPEN); + + $parameters = null; + if (!$this->cursor->is(Opcode::PARENTHESES_CLOSE)) { + $parameters = [$this->parseMacroParameter()]; + $this->cursor->reduce(1); + + while ($this->cursor->is(Opcode::COMMA)) { + $this->cursor->shift(); + $parameters[] = $this->parseMacroParameter(); + $this->cursor->reduce(3); + } } - $parser->phvolt_(Opcode::OPEN_EDELIMITER->value); + $this->cursor->expect(Opcode::PARENTHESES_CLOSE); + $this->cursor->expect(Opcode::CLOSE_DELIMITER); + $statements = $this->parseBody(Opcode::ENDMACRO); + + return $this->ast->macroStatement( + $name, + $parameters, + $statements, + $this->cursor->reduce($parameters === null ? 10 : 11) + ); } - private function handleRawFragment( - phvolt_Parser $parser, - Status $parserStatus, - Token $token, - State $state - ): void { - if ($token->length === 0) { - return; + /** + * macro_parameter ::= IDENTIFIER | IDENTIFIER = macro_parameter_default + * macro_parameter_default ::= INTEGER | STRING | DOUBLE | NULL | FALSE | TRUE + * + * @return array + * + * @throws Exception + */ + private function parseMacroParameter(): array + { + $variable = (string) $this->cursor->expect(Opcode::IDENTIFIER)->value; + + if (!$this->cursor->is(Opcode::ASSIGN)) { + return $this->ast->macroParameter($variable, null, $this->cursor->reduce(1)); } - $value = trim((string)$token->value); + $this->cursor->shift(); + + $type = match ($this->cursor->current->opcode) { + Opcode::INTEGER->value => Opcode::INTEGER, + Opcode::STRING->value => Opcode::STRING, + Opcode::DOUBLE->value => Opcode::DOUBLE, + Opcode::NULL->value => Opcode::NULL, + Opcode::FALSE->value => Opcode::FALSE, + Opcode::TRUE->value => Opcode::TRUE, + default => throw $this->cursor->unexpected(), + }; + + $token = $this->cursor->shift(); + $default = $this->ast->literal($type, $token->value, $this->cursor->reduce(1)); - if ($value !== '' && $state->getExtendsMode() === 1 && $state->getBlockLevel() === 0) { - $this->createErrorMessage($parserStatus, 'Child templates only may contain blocks'); - $parserStatus->setStatus(Status::PHVOLT_PARSING_FAILED); + return $this->ast->macroParameter($variable, $default, $this->cursor->reduce(3)); + } - return; + /** + * program ::= volt_language ::= statement_list + * + * A template that yields no token at all (only comments, say) is an empty + * program, as in cphalcon. + * + * @return array> + * + * @throws Exception + */ + private function parseProgram(): array + { + if ($this->cursor->atEnd()) { + return []; } - if (!$this->isBlankString($token)) { - $state->incrementStatementPosition(); + [$statements] = $this->parseStatementList([], []); + + if ($statements === null || !$this->cursor->atEnd()) { + throw $this->cursor->unexpected(); } - $this->parseWithToken($parser, $token, Opcode::RAW_FRAGMENT); + return $statements; + } + + /** + * raw_fragment ::= RAW_FRAGMENT + * + * @return array + * + * @throws Exception + */ + private function parseRawFragment(): array + { + $token = $this->cursor->shift(); + + return $this->ast->literal(Opcode::RAW_FRAGMENT, $token->value, $this->cursor->reduce(1)); } - private function handleSet(phvolt_Parser $parser, Status $parserStatus, State $state): void + /** + * set_statement ::= {% SET set_assignments %} + * set_assignments ::= set_assignments , set_assignment | set_assignment + * set_assignment ::= assignable_expr (= | += | -= | *= | /=) expr + * + * @return array + * + * @throws Exception + */ + private function parseSet(): array { - if ($state->getExtendsMode() === 1 && $state->getBlockLevel() === 0) { - $this->createErrorMessage($parserStatus, 'Child templates only may contain blocks'); - $parserStatus->setStatus(Status::PHVOLT_PARSING_FAILED); + $this->cursor->shift(); - return; + $assignments = [$this->parseAssignment()]; + $this->cursor->reduce(1); + + while ($this->cursor->is(Opcode::COMMA)) { + $this->cursor->shift(); + $assignments[] = $this->parseAssignment(); + $this->cursor->reduce(3); } - $parser->phvolt_(Opcode::SET->value); + $this->cursor->expect(Opcode::CLOSE_DELIMITER); + $this->cursor->reduce(4); + + return $this->ast->setStatement($assignments); } - private function handleSwitch(phvolt_Parser $parser, Status $parserStatus, State $state): void + /** + * statement_list ::= statement_list statement | statement + * + * Parses statements until `{%` is followed by one of the terminators of the + * enclosing rule; that `{%` has then been shifted and the terminator + * keyword is the current token. $whenEmpty / $whenNotEmpty list the + * terminators the enclosing rule accepts before and after the first + * statement (the grammar has distinct rules for empty bodies). + * + * Returns at any other token that cannot start a statement, leaving the + * caller to report it. + * + * @param list $whenEmpty + * @param list $whenNotEmpty + * + * Returns the statements (null when there were none) and the terminator. + * + * @return array{0: list>|null, 1: Opcode|null} + * + * @throws Exception + * + * @phpstan-impure + */ + private function parseStatementList(array $whenEmpty, array $whenNotEmpty): array { - if ($state->getExtendsMode() === 1 && $state->getBlockLevel() === 0) { - $this->createErrorMessage($parserStatus, 'Child templates only may contain blocks'); - $parserStatus->setStatus(Status::PHVOLT_PARSING_FAILED); + $statements = null; + + while (true) { + if ($this->cursor->is(Opcode::RAW_FRAGMENT)) { + $statement = $this->parseRawFragment(); + } elseif ($this->cursor->is(Opcode::OPEN_EDELIMITER)) { + $statement = $this->parseEcho(); + } elseif ($this->cursor->is(Opcode::OPEN_DELIMITER)) { + $this->cursor->shift(); + + $terminators = $statements === null ? $whenEmpty : $whenNotEmpty; + foreach ($terminators as $terminator) { + if ($this->cursor->is($terminator)) { + return [$statements, $terminator]; + } + } + + $statement = $this->parseTag(); + } else { + return [$statements, null]; + } - return; + if ($statements === null) { + $statements = [$statement]; + $this->cursor->reduce(1); + } else { + $statements[] = $statement; + $this->cursor->reduce(2); + } } + } - if ($state->getSwitchLevel() > 0) { - $this->createErrorMessage( - $parserStatus, - 'A nested switch detected. There is no nested switch-case statements support' - ); - $parserStatus->setStatus(Status::PHVOLT_PARSING_FAILED); + /** + * switch_statement ::= {% SWITCH expr %} statement_list {% ENDSWITCH %} + * | {% SWITCH expr %} {% ENDSWITCH %} + * + * Case clauses are ordinary statements of the list. + * + * @return array + * + * @throws Exception + */ + private function parseSwitch(): array + { + $expr = $this->parseKeywordExpr(); - return; - } + [$clauses, $terminator] = $this->parseStatementList([Opcode::ENDSWITCH], [Opcode::ENDSWITCH]); + $this->closeList(Opcode::ENDSWITCH, $terminator); - $state->setSwitchLevel(1); - $state->incrementBlockLevel(); - $parser->phvolt_(Opcode::SWITCH->value); + return $this->ast->switchStatement($expr, $clauses, $this->cursor->reduce($clauses === null ? 7 : 8)); } - private function handleUnknownOpcode(Status $parserStatus, int $opcode): void + /** + * A statement after its `{%` (already shifted). + * + * @return array + * + * @throws Exception + */ + private function parseTag(): array { - $this->createErrorMessage($parserStatus, sprintf('Scanner: unknown opcode %d', $opcode)); - $parserStatus->setStatus(Status::PHVOLT_PARSING_FAILED); + return match ($this->cursor->current->opcode) { + Opcode::IF->value => $this->parseIf(), + Opcode::ELSEIF->value => $this->parseElseIf(), + Opcode::ELSEFOR->value => $this->parseBare(Opcode::ELSEFOR), + Opcode::FOR->value => $this->parseFor(), + Opcode::SWITCH->value => $this->parseSwitch(), + Opcode::CASE->value => $this->parseCase(), + Opcode::DEFAULT->value => $this->parseBare(Opcode::DEFAULT), + Opcode::SET->value => $this->parseSet(), + Opcode::BLOCK->value => $this->parseBlock(), + Opcode::EXTENDS->value => $this->parseExtends(), + Opcode::INCLUDE->value => $this->parseInclude(), + Opcode::DO->value => $this->parseExprStatement(Opcode::DO), + Opcode::RETURN->value => $this->parseExprStatement(Opcode::RETURN), + Opcode::AUTOESCAPE->value => $this->parseAutoescape(), + Opcode::VERBATIM->value => $this->parseVerbatim(), + Opcode::BREAK->value => $this->parseBare(Opcode::BREAK), + Opcode::CONTINUE->value => $this->parseBare(Opcode::CONTINUE), + Opcode::MACRO->value => $this->parseMacro(), + Opcode::CALL->value => $this->parseCall(), + Opcode::CLOSE_DELIMITER->value => $this->parseEmpty(), + default => throw $this->cursor->unexpected(), + }; } - private function isBlankString(Token $token): bool + /** + * verbatim_statement ::= {% VERBATIM %} raw_fragment {% ENDVERBATIM %} + * | {% VERBATIM %} {% ENDVERBATIM %} + * + * The statement IS its raw fragment; an empty block is a RAW_FRAGMENT + * node without a value. + * + * @return array + * + * @throws Exception + */ + private function parseVerbatim(): array { - $marker = (string)$token->value; - $len = strlen($marker); + $this->cursor->shift(); + $this->cursor->expect(Opcode::CLOSE_DELIMITER); - for ($i = 0; $i < $len; $i++) { - $ch = $marker[$i]; - if ($ch !== ' ' && $ch !== "\t" && $ch !== "\n" && $ch !== "\r" && $ch !== "\v") { - return false; - } - } + if ($this->cursor->is(Opcode::RAW_FRAGMENT)) { + $fragment = $this->parseRawFragment(); + $this->expectEndTag(Opcode::ENDVERBATIM); + $this->cursor->reduce(7); - return true; - } + return $fragment; + } - private function parseWithToken(phvolt_Parser $parser, Token $token, Opcode $parserCode): void - { - $newToken = new Token($token->opcode, $token->value); + $this->expectEndTag(Opcode::ENDVERBATIM); - $parser->phvolt_($parserCode->value, $newToken); + return $this->ast->literal(Opcode::RAW_FRAGMENT, null, $this->cursor->reduce(6)); } } diff --git a/src/Parser/Status.php b/src/Parser/Status.php deleted file mode 100644 index 1673b01..0000000 --- a/src/Parser/Status.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE.txt - * file that was distributed with this source code. - */ - -declare(strict_types=1); - -namespace Phalcon\Volt\Parser; - -use Phalcon\Volt\Scanner\State; -use Phalcon\Volt\Scanner\Token; - -class Status -{ - public const PHVOLT_PARSING_FAILED = 0; - - public const PHVOLT_PARSING_OK = 1; - - private ?string $lastTokenValue = null; - - private ?string $syntaxError = null; - - private ?Token $token = null; - - public function __construct( - private State $scannerState, - private int $status = self::PHVOLT_PARSING_OK, - ) { - } - - public function getLastTokenValue(): ?string - { - return $this->lastTokenValue; - } - - public function getState(): State - { - return $this->scannerState; - } - - public function getStatus(): int - { - return $this->status; - } - - public function getSyntaxError(): ?string - { - return $this->syntaxError; - } - - public function getToken(): ?Token - { - return $this->token; - } - - public function setStatus(int $status): static - { - $this->status = $status; - - return $this; - } - - public function setSyntaxError(string $syntaxError): static - { - $this->syntaxError = $syntaxError; - - return $this; - } - - public function setToken(Token $token): static - { - $this->token = $token; - if ($token->value !== null) { - $this->lastTokenValue = $token->value; - } - - return $this; - } -} diff --git a/src/Parser/TokenStream.php b/src/Parser/TokenStream.php new file mode 100644 index 0000000..1ea9237 --- /dev/null +++ b/src/Parser/TokenStream.php @@ -0,0 +1,455 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Volt\Parser; + +use Phalcon\Volt\Compiler\Opcode; +use Phalcon\Volt\Exception; +use Phalcon\Volt\Scanner\Scanner; +use Phalcon\Volt\Scanner\ScannerStatus; +use Phalcon\Volt\Scanner\State; +use Phalcon\Volt\Scanner\Token; +use Phalcon\Volt\Tokens; + +use function sprintf; +use function strlen; +use function strpos; +use function strspn; +use function substr; + +/** + * Port of the token loop in cphalcon's `phvolt_internal_parse_view()` + * (ext/phalcon/mvc/view/engine/volt/base.c lines 300-800): it pulls tokens + * from the scanner ON DEMAND and, for each one, does what base.c does before + * handing it to the parser: + * + * - records the active token and how much input is left after it (both are + * read back by the syntax-error message); + * - runs the template checks (child templates may only contain blocks, + * nested switch / block / macro, extends must come first, ...) - these + * throw before the token reaches the parser; + * - remaps tokens: ELSE inside a `for` (and no `if`) becomes ELSEFOR, and + * DEFAULT is the switch clause only right after `{%` inside a switch; + * - drops what the parser never sees: whitespace, empty raw fragments and + * blank raw fragments at the top level of a child template. + * + * Scanning on demand rather than up front matters: a check on a later token + * must not pre-empt a syntax error that cphalcon reports on an earlier one. + * + * The level counters are C `unsigned int`s and wrap the same way. + */ +final class TokenStream +{ + /** + * Blank characters for raw fragments (phvolt_is_blank_string). + */ + private const BLANK = " \t\n\r\v"; + + private const UINT_MASK = 0xFFFFFFFF; + + private int $blockLevel = 0; + + private readonly string $code; + + private bool $extendsMode = false; + + private int $forLevel = 0; + + private int $ifLevel = 0; + + private int $macroLevel = 0; + + private int $oldIfLevel = 0; + + /** + * Opcode of the last scanned token that was not whitespace. + */ + private int $previous = 0; + + private readonly Scanner $scanner; + + /** + * base.c `state->start_length`: bytes left after the last scanned token. + */ + private int $startLength = 0; + + private readonly State $state; + + private int $switchLevel = 0; + + /** + * The scanner token's value as cphalcon's syntax-error message sees it: + * set when a value token is scanned, cleared once the parser has + * consumed it (phvolt_parse_with_token). + * + * In three places base.c frees the value without clearing the pointer, + * and a later syntax error prints the dangling value with its old length: + * - a raw fragment trimmed to nothing by whitespace control has length + * 0, so C deterministically prints "()" - reproduced here; + * - a blank raw fragment dropped from a child template, and the + * `{% default %}` keyword, have a non-zero length, so C prints freed + * heap memory - undefined behaviour that this port does not imitate + * (it prints no value). + */ + private ?string $value = null; + + public function __construct(string $code, private readonly string $file) + { + $this->code = $code; + $this->state = new State($code); + $this->scanner = new Scanner($this->state); + } + + /** + * The parser has consumed $token (cphalcon clears the token value after a + * value-carrying token has been fed). + */ + public function consumed(Token $token): void + { + if ($token->value !== null) { + $this->value = null; + } + } + + public function file(): string + { + return $this->file; + } + + /** + * The scanner's current line - the line Lemon stamps on a node reduced now. + */ + public function line(): int + { + return $this->state->getActiveLine(); + } + + /** + * The next token for the parser, or an EOF token (opcode 0). + * + * @throws Exception on a scanning error or a failed template check + */ + public function next(): Token + { + while (true) { + $status = $this->scanner->scanForToken(); + + if ($status === ScannerStatus::EOF) { + return new Token(0); + } + + if ($status !== ScannerStatus::OK) { + throw new Exception($this->scanningErrorMessage()); + } + + $token = $this->scanner->getToken(); + $opcode = $token->opcode; + + $this->state->setActiveToken($opcode); + $this->startLength = strlen($this->code) - $this->state->getCursor(); + + if ($token->value !== null) { + $this->value = $token->value; + } + + $fed = $this->check($token); + + if ($opcode !== Opcode::IGNORE->value) { + $this->previous = $opcode; + } + + if ($fed !== null) { + return $fed; + } + } + } + + /** + * The `%stack_overflow` message of parser.php.lemon (no file, no line). + */ + public function stackOverflow(): Exception + { + return new Exception('Parsing failed, the template expression is nested too deeply'); + } + + /** + * The `%syntax_error` message of parser.php.lemon, built from the state + * left by the last scanned token. + */ + public function syntaxError(): Exception + { + if ($this->startLength !== 0) { + $active = (int) $this->state->getActiveToken(); + $name = $active !== 0 ? Tokens::name($active) : 'UNKNOWN'; + $value = $this->value !== null ? '(' . $this->value . ')' : ''; + + return new Exception( + 'Syntax error, unexpected token ' . $name . $value + . ' in ' . $this->file . ' on line ' . $this->line() + ); + } + + $message = 'Syntax error, unexpected EOF in ' . $this->file; + + $ifBlocks = ($this->ifLevel + $this->oldIfLevel) & self::UINT_MASK; + if ($ifBlocks === 1) { + $message .= ", there is one 'if' block without close"; + } elseif ($ifBlocks > 1) { + $message .= ", there are " . $ifBlocks . " 'if' blocks without close"; + } + + if ($this->forLevel === 1) { + $message .= ", there is one 'for' block without close"; + } elseif ($this->forLevel > 1) { + // cphalcon prints the if level here, not the for level + $message .= ", there are " . $this->ifLevel . " 'for' blocks without close"; + } + + if ($this->switchLevel > 0) { + $message .= ", there is a 'switch' block without 'endswitch'"; + } + + return new Exception($message); + } + + /** + * @throws Exception + */ + private function assertBlockInChildTemplate(): void + { + if ($this->extendsMode && $this->blockLevel === 0) { + throw $this->templateError('Child templates only may contain blocks'); + } + } + + /** + * The per-token switch of base.c: returns the token to feed to the + * parser, or null when the token is not fed. + * + * @throws Exception + */ + private function check(Token $token): ?Token + { + $opcode = Opcode::from($token->opcode); + + switch ($opcode) { + case Opcode::IGNORE: + return null; + + case Opcode::OPEN_EDELIMITER: + case Opcode::SET: + $this->assertBlockInChildTemplate(); + + return $token; + + case Opcode::IF: + $this->assertBlockInChildTemplate(); + $this->ifLevel = $this->increment($this->ifLevel); + $this->blockLevel = $this->increment($this->blockLevel); + + return $token; + + case Opcode::ELSE: + if ($this->ifLevel === 0 && $this->forLevel > 0) { + return new Token(Opcode::ELSEFOR->value); + } + + return $token; + + case Opcode::ELSEIF: + if ($this->ifLevel === 0) { + throw $this->templateError('Unexpected ENDIF'); + } + + return $token; + + case Opcode::ENDIF: + $this->blockLevel = $this->decrement($this->blockLevel); + $this->ifLevel = $this->decrement($this->ifLevel); + + return $token; + + case Opcode::FOR: + $this->assertBlockInChildTemplate(); + $this->oldIfLevel = $this->ifLevel; + $this->ifLevel = 0; + $this->forLevel = $this->increment($this->forLevel); + $this->blockLevel = $this->increment($this->blockLevel); + + return $token; + + case Opcode::ENDFOR: + $this->blockLevel = $this->decrement($this->blockLevel); + $this->forLevel = $this->decrement($this->forLevel); + $this->ifLevel = $this->oldIfLevel; + + return $token; + + case Opcode::SWITCH: + $this->assertBlockInChildTemplate(); + if ($this->switchLevel > 0) { + throw $this->templateError( + 'A nested switch detected. There is no nested switch-case statements support' + ); + } + $this->switchLevel = 1; + $this->blockLevel = $this->increment($this->blockLevel); + + return $token; + + case Opcode::CASE: + if ($this->switchLevel === 0) { + throw $this->templateError('Unexpected CASE'); + } + + return $token; + + case Opcode::DEFAULT: + if ($this->switchLevel !== 0 && $this->previous === Opcode::OPEN_DELIMITER->value) { + // the value lives until the parser consumes the clause keyword + return new Token(Opcode::DEFAULT->value, $token->value); + } + + return new Token(Opcode::IDENTIFIER->value, $token->value); + + case Opcode::ENDSWITCH: + if ($this->switchLevel === 0) { + throw $this->templateError('Unexpected ENDSWITCH'); + } + $this->switchLevel = 0; + $this->blockLevel = $this->decrement($this->blockLevel); + + return $token; + + case Opcode::RAW_FRAGMENT: + return $this->checkRawFragment($token); + + case Opcode::BLOCK: + if ($this->blockLevel > 0) { + throw $this->templateError('Embedding blocks into other blocks is not supported'); + } + $this->blockLevel = $this->increment($this->blockLevel); + + return $token; + + case Opcode::ENDBLOCK: + $this->blockLevel = $this->decrement($this->blockLevel); + + return $token; + + case Opcode::MACRO: + if ($this->macroLevel > 0) { + throw $this->templateError('Embedding macros into other macros is not allowed'); + } + $this->macroLevel = $this->increment($this->macroLevel); + + return $token; + + case Opcode::ENDMACRO: + $this->macroLevel = $this->decrement($this->macroLevel); + + return $token; + + case Opcode::EXTENDS: + if ($this->state->getStatementPosition() !== 1) { + throw $this->templateError('Extends statement must be placed at the first line in the template'); + } + $this->extendsMode = true; + + return $token; + + default: + return $token; + } + } + + /** + * @throws Exception + */ + private function checkRawFragment(Token $token): ?Token + { + $fragment = (string) $token->value; + + if ($fragment === '') { + // freed, not cleared, length 0: a later error prints "()" + $this->value = ''; + + return null; + } + + $blank = strspn($fragment, self::BLANK) === strlen($fragment); + + if ($this->extendsMode && $this->blockLevel === 0) { + if (!$blank) { + throw $this->templateError('Child templates only may contain blocks'); + } + // freed, not cleared: cphalcon would print heap garbage + $this->value = null; + + return null; + } + + if (!$blank) { + $this->state->incrementStatementPosition(); + } + + return $token; + } + + private function decrement(int $level): int + { + return ($level - 1) & self::UINT_MASK; + } + + private function increment(int $level): int + { + return ($level + 1) & self::UINT_MASK; + } + + /** + * phvolt_scanner_error_msg. The offending byte has been consumed; the + * message quotes what follows it - 16 bytes and "..." when more than 16 + * bytes were left before it, the whole rest otherwise. Like a C string, + * the quote stops at a NUL byte. + */ + private function scanningErrorMessage(): string + { + $rest = substr($this->code, $this->state->getCursor()); + $nul = strpos($rest, "\0"); + if ($nul !== false) { + $rest = substr($rest, 0, $nul); + } + + if ($this->startLength > 16) { + return sprintf( + "Scanning error before '%s...' in %s on line %d", + substr($rest, 0, 16), + $this->file, + $this->line() + ); + } + + return sprintf("Scanning error before '%s' in %s on line %d", $rest, $this->file, $this->line()); + } + + /** + * phvolt_create_error_msg: " in on line ", capped + * like the C buffer (128 + strlen(file) bytes including the terminator). + */ + private function templateError(string $message): Exception + { + $error = sprintf('%s in %s on line %d', $message, $this->file, $this->line()); + + return new Exception(substr($error, 0, 127 + strlen($this->file))); + } +} diff --git a/src/Scanner/Opcode.php b/src/Scanner/Opcode.php deleted file mode 100644 index cf01c85..0000000 --- a/src/Scanner/Opcode.php +++ /dev/null @@ -1,147 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE.txt - * file that was distributed with this source code. - */ - -declare(strict_types=1); - -namespace Phalcon\Volt\Scanner; - -enum Opcode: int -{ - case ADD_ASSIGN = 46; - case AND = 6; - case ASSIGN = 45; - case AUTOESCAPE = 73; - case BLOCK = 64; - case BREAK = 75; - case CALL = 60; - case CASE = 42; - case CBRACKET_CLOSE = 86; - case CBRACKET_OPEN = 85; - case CLOSE_DELIMITER = 32; - case CLOSE_EDELIMITER = 63; - case COLON = 4; - case COMMA = 2; - case CONCAT = 23; - case CONTINUE = 76; - case DECR = 28; - case DEFAULT = 43; - case DEFINED = 78; - case DIV_ASSIGN = 49; - case DIVIDE = 18; - case DO = 71; - case DOT = 30; - case DOUBLE = 56; - case ELSE = 34; - case ELSEFOR = 36; - case ELSEIF = 35; - case EMPTY = 79; - case ENDAUTOESCAPE = 74; - case ENDBLOCK = 65; - case ENDCALL = 61; - case ENDFOR = 39; - case ENDIF = 33; - case ENDMACRO = 53; - case ENDSWITCH = 41; - case ENDVERBATIM = 67; - case EQUALS = 10; - case EVEN = 80; - case EXTENDS = 68; - case FALSE = 58; - case FOR = 37; - case GREATER = 13; - case GREATEREQUAL = 14; - case IDENTICAL = 16; - case IDENTIFIER = 38; - case IF = 31; - case IN = 8; - case INCLUDE = 69; - case INCR = 27; - case INTEGER = 54; - case IS = 9; - case ITERABLE = 84; - case LESS = 12; - case LESSEQUAL = 15; - case MACRO = 51; - case MINUS = 22; - case MOD = 20; - case MUL_ASSIGN = 48; - case NOT = 26; - case NOTEQUALS = 11; - case NOTIDENTICAL = 17; - case NULL = 57; - case NUMERIC = 82; - case ODD = 81; - case OPEN_DELIMITER = 1; - case OPEN_EDELIMITER = 62; - case OR = 7; - case PARENTHESES_CLOSE = 52; - case PARENTHESES_OPEN = 29; - case PIPE = 25; - case PLUS = 21; - case QUESTION = 3; - case RANGE = 5; - case RAW_FRAGMENT = 77; - case RETURN = 72; - case SBRACKET_CLOSE = 50; - case SBRACKET_OPEN = 24; - case SCALAR = 83; - case SET = 44; - case STRING = 55; - case SUB_ASSIGN = 47; - case SWITCH = 40; - case TIMES = 19; - case TRUE = 59; - case VERBATIM = 66; - case WITH = 70; - - public function label(): string - { - return match ($this) { - self::ADD_ASSIGN => '+=', - self::CBRACKET_CLOSE => '}', - self::CBRACKET_OPEN => '{', - self::CLOSE_DELIMITER => '%}', - self::CLOSE_EDELIMITER => '}}', - self::COLON => ':', - self::COMMA => ',', - self::CONCAT => '~', - self::DECR => '--', - self::DIVIDE => '/', - self::DIV_ASSIGN => '/=', - self::DOT => '.', - self::EQUALS => '=', - self::GREATER => '>', - self::GREATEREQUAL => '>=', - self::IDENTICAL => '===', - self::INCR => '++', - self::LESS => '<', - self::LESSEQUAL => '<=', - self::MINUS => '-', - self::MOD => '%', - self::MUL_ASSIGN => '*=', - self::NOT => '!', - self::NOTEQUALS => '!=', - self::NOTIDENTICAL => '!==', - self::OPEN_DELIMITER => '{%', - self::OPEN_EDELIMITER => '{{', - self::PARENTHESES_CLOSE => ')', - self::PARENTHESES_OPEN => '(', - self::PIPE => '|', - self::PLUS => '+', - self::QUESTION => '?', - self::SBRACKET_CLOSE => ']', - self::SBRACKET_OPEN => '[', - self::SUB_ASSIGN => '-=', - self::TIMES => '*', - default => $this->name, - }; - } -} diff --git a/src/Scanner/Scanner.php b/src/Scanner/Scanner.php index b901e7e..fb3bb99 100644 --- a/src/Scanner/Scanner.php +++ b/src/Scanner/Scanner.php @@ -15,12 +15,208 @@ use Phalcon\Volt\Compiler\Opcode; -class Scanner +use function ltrim; +use function max; +use function preg_match; +use function rtrim; +use function str_contains; +use function strlen; +use function strpos; +use function strspn; +use function strtolower; +use function substr; +use function substr_count; + +/** + * Hand-written port of cphalcon's re2c scanner + * (ext/phalcon/mvc/view/engine/volt/scanner.re). + * + * The scanner has three modes: + * + * - RAW: text outside tags is buffered until `{{`, `{%` or the end of input + * and emitted as one RAW_FRAGMENT. `{# ... #}` comments are swallowed + * without flushing the buffer, so `a{# c #}b` is the single fragment "ab". + * - VERBATIM: after `{% verbatim %}`, everything up to `{% endverbatim %}` is + * captured literally. + * - CODE: inside tags, one token per call. This is the re2c part, and it keeps + * re2c's two tie-break rules: + * 1. the longest match wins - DOUBLE is tried before INTEGER, `is not` + * beats `is`, `===` beats `==`, `-%}` beats `-`; + * 2. on equal length the rule listed first wins, and every keyword is + * listed before IDENTIFIER - so `if` is IF but `iffy` is IDENTIFIER. + * + * Input is treated as NUL-terminated, like the C buffer: a NUL byte ends the + * scan exactly as the end of the string does. + * + * Whitespace control (`{%-`, `{{-`, `-%}`, `-}}`) trims exactly space, \t, + * \n, \r and \v. A left-trim requested by `-%}` / `-}}` applies to the next + * non-empty fragment, so it crosses comments; any opening tag cancels it. + */ +final class Scanner { + /** + * Keywords whose scanner.re action increments the statement position. + * The driver uses the position to enforce "extends must come first". + * + * @var array + */ + private const COUNTS_AS_STATEMENT = [ + 'autoescape' => true, + 'block' => true, + 'break' => true, + 'call' => true, + 'continue' => true, + 'defined' => true, + 'do' => true, + 'empty' => true, + 'endautoescape' => true, + 'endverbatim' => true, + 'even' => true, + 'extends' => true, + 'for' => true, + 'if' => true, + 'include' => true, + 'is' => true, + 'iterable' => true, + 'macro' => true, + 'not' => true, + 'numeric' => true, + 'odd' => true, + 'scalar' => true, + 'switch' => true, + 'verbatim' => true, + ]; + + private const DOUBLE_OR_INTEGER = '/[0-9]+(?:\.[0-9]+)?/A'; + + private const ENDVERBATIM = '/\{%-?[ \t\r\n]*endverbatim(?![a-zA-Z0-9_])/Ai'; + + private const IDENTIFIER = '/\\\\?[a-zA-Z_][a-zA-Z0-9_\\\\]*/A'; + + private const IS_NOT_ONE_SPACE = '/is not/Ai'; + + private const IS_NOT_SPACES = '/is +not/A'; + + /** + * Keywords, matched case-insensitively. `cache` / `endcache` are + * deliberately absent: phalcon/volt removed the cache statement, so they + * scan as identifiers. + * + * @var array + */ + private const KEYWORDS = [ + 'and' => Opcode::AND, + 'autoescape' => Opcode::AUTOESCAPE, + 'block' => Opcode::BLOCK, + 'break' => Opcode::BREAK, + 'call' => Opcode::CALL, + 'case' => Opcode::CASE, + 'continue' => Opcode::CONTINUE, + 'default' => Opcode::DEFAULT, + 'defined' => Opcode::DEFINED, + 'do' => Opcode::DO, + 'else' => Opcode::ELSE, + 'elsefor' => Opcode::ELSEFOR, + 'elseif' => Opcode::ELSEIF, + 'empty' => Opcode::EMPTY, + 'endautoescape' => Opcode::ENDAUTOESCAPE, + 'endblock' => Opcode::ENDBLOCK, + 'endcall' => Opcode::ENDCALL, + 'endfor' => Opcode::ENDFOR, + 'endif' => Opcode::ENDIF, + 'endmacro' => Opcode::ENDMACRO, + 'endswitch' => Opcode::ENDSWITCH, + 'endverbatim' => Opcode::ENDVERBATIM, + 'even' => Opcode::EVEN, + 'extends' => Opcode::EXTENDS, + 'false' => Opcode::FALSE, + 'for' => Opcode::FOR, + 'if' => Opcode::IF, + 'in' => Opcode::IN, + 'include' => Opcode::INCLUDE, + 'is' => Opcode::IS, + 'iterable' => Opcode::ITERABLE, + 'macro' => Opcode::MACRO, + 'not' => Opcode::NOT, + 'null' => Opcode::NULL, + 'numeric' => Opcode::NUMERIC, + 'odd' => Opcode::ODD, + 'or' => Opcode::OR, + 'return' => Opcode::RETURN, + 'scalar' => Opcode::SCALAR, + 'set' => Opcode::SET, + 'switch' => Opcode::SWITCH, + 'true' => Opcode::TRUE, + 'verbatim' => Opcode::VERBATIM, + 'with' => Opcode::WITH, + ]; + + /** + * Punctuation and operators, longest first within each leading character + * so the first hit is the longest match. + * + * @var array> + */ + private const OPERATORS = [ + '!' => [['!==', Opcode::NOTIDENTICAL], ['!=', Opcode::NOTEQUALS], ['!', Opcode::NOT]], + '%' => [['%}', Opcode::CLOSE_DELIMITER], ['%', Opcode::MOD]], + '(' => [['(', Opcode::PARENTHESES_OPEN]], + ')' => [[')', Opcode::PARENTHESES_CLOSE]], + '*' => [['*=', Opcode::MUL_ASSIGN], ['*', Opcode::MUL]], + '+' => [['++', Opcode::INCR], ['+=', Opcode::ADD_ASSIGN], ['+', Opcode::ADD]], + ',' => [[',', Opcode::COMMA]], + '-' => [ + ['-%}', Opcode::CLOSE_DELIMITER], + ['-}}', Opcode::CLOSE_EDELIMITER], + ['--', Opcode::DECR], + ['-=', Opcode::SUB_ASSIGN], + ['-', Opcode::SUB], + ], + '.' => [['..', Opcode::RANGE], ['.', Opcode::DOT]], + '/' => [['/=', Opcode::DIV_ASSIGN], ['/', Opcode::DIV]], + ':' => [[':', Opcode::COLON]], + '<' => [['<=', Opcode::LESSEQUAL], ['<>', Opcode::NOTEQUALS], ['<', Opcode::LESS]], + '=' => [['===', Opcode::IDENTICAL], ['==', Opcode::EQUALS], ['=', Opcode::ASSIGN]], + '>' => [['>=', Opcode::GREATEREQUAL], ['>', Opcode::GREATER]], + '?' => [['?', Opcode::QUESTION]], + '[' => [['[', Opcode::SBRACKET_OPEN]], + ']' => [[']', Opcode::SBRACKET_CLOSE]], + '{' => [ + ['{%-', Opcode::OPEN_DELIMITER], + ['{{-', Opcode::OPEN_EDELIMITER], + ['{%', Opcode::OPEN_DELIMITER], + ['{{', Opcode::OPEN_EDELIMITER], + ['{', Opcode::CBRACKET_OPEN], + ], + '|' => [['|', Opcode::PIPE]], + '}' => [['}}', Opcode::CLOSE_EDELIMITER], ['}', Opcode::CBRACKET_CLOSE]], + '~' => [['~', Opcode::CONCAT]], + ]; + + private const STRING_DOUBLE = '/"(?:\\\\[^\n\x00]|[^\x00\\\\"])*"/A'; + + private const STRING_SINGLE = "/'(?:\\\\[^\\n\\x00]|[^\\x00\\\\'])*'/A"; + + /** + * Characters removed by whitespace control (phvolt_ltrim/phvolt_rtrim). + */ + private const TRIM = " \t\n\r\v"; + + private readonly string $code; + + /** + * Offset of the first NUL byte, or the length of the input: everything + * from here on is invisible, as it is to the C scanner. + */ + private readonly int $end; + private Token $token; public function __construct(private State $state) { + $this->code = $state->getCode(); + $nul = strpos($this->code, "\0"); + $this->end = $nul === false ? strlen($this->code) : $nul; $this->token = new Token(); } @@ -29,6098 +225,369 @@ public function getToken(): Token return $this->token; } + /** + * Scans the next token. On OK the token is available from getToken(); on + * ERR the cursor has moved past the offending byte, as in C. + */ public function scanForToken(): ScannerStatus { - $status = $this->scan(); + return match ($this->state->getMode()) { + Mode::VERBATIM => $this->scanVerbatim(), + Mode::CODE => $this->scanCode(), + Mode::RAW, Mode::COMMENT => $this->scanRaw(), + }; + } - /** - * "verbatim" / "endverbatim" are reserved words. The generated DFA - * matches them as plain identifiers, so they are reclassified here at - * the single scanner exit point - this emits the exact token stream - * cphalcon produces without rebuilding the generated state machine. - */ - if ( - $status === ScannerStatus::OK - && $this->state->getMode() === Mode::CODE->value - && $this->token->opcode === Opcode::IDENTIFIER->value - ) { - $keyword = strtolower((string) $this->token->value); + private function consumeRaw(int $from, int $to): void + { + $text = substr($this->code, $from, $to - $from); - if ($keyword === 'verbatim') { - $this->state->incrementStatementPosition()->setVerbatim(1); - $this->token = new Token(Opcode::VERBATIM->value); - } elseif ($keyword === 'endverbatim') { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::ENDVERBATIM->value); - } - } + $this->state->appendToRawFragment($text); + $this->state->incrementActiveLine(substr_count($text, "\n")); + $this->state->setCursor($to); + } + + private function emit(Opcode $opcode, int $next, ?string $value = null): ScannerStatus + { + $this->state->setCursor($next); + $this->token = new Token($opcode->value, $value); - return $status; + return ScannerStatus::OK; } /** - * Looks ahead from a "{%" sequence inside a verbatim block to decide - * whether it opens the closing "{% endverbatim %}" tag. Mirrors the - * peek logic in cphalcon's scanner: optional "-" marker, surrounding - * whitespace, case-insensitive "endverbatim" as a whole word. + * Ends RAW mode at a tag (or the end of input): emits the buffered text as + * a RAW_FRAGMENT, or IGNORE when nothing was buffered. The cursor stays on + * the tag, which CODE mode then scans. */ - private function isEndVerbatimAhead(): bool + private function flushRaw(int $tag): ScannerStatus { - $buffer = $this->state->getRawBuffer(); - // The cursor is on "{" and the next character is "%". - $peek = $this->state->getCursor() + 2; + $this->state->setMode(Mode::CODE); - if (($buffer[$peek] ?? '') === '-') { - $peek++; + $fragment = $this->state->getRawFragment(); + if ($fragment === '') { + $this->token = new Token(Opcode::IGNORE->value); + + return ScannerStatus::OK; } - while (in_array($buffer[$peek] ?? '', [' ', "\t", "\r", "\n"], true)) { - $peek++; + if ($this->state->getWhitespaceControl()) { + $fragment = ltrim($fragment, self::TRIM); + $this->state->setWhitespaceControl(false); } - if (strtolower(substr($buffer, $peek, 11)) !== 'endverbatim') { - return false; + $isTag = $tag < $this->end; + if ($isTag && $tag + 2 < $this->end && $this->code[$tag + 2] === '-') { + $fragment = rtrim($fragment, self::TRIM); } - $after = $buffer[$peek + 11] ?? ''; + $this->state->setRawFragment(''); + $this->token = new Token(Opcode::RAW_FRAGMENT->value, $fragment); - return $after === '' || (!ctype_alnum($after) && $after !== '_'); + return ScannerStatus::OK; } - private function scan(): ScannerStatus + /** + * Length of `is not` at $cursor: `is not` with one space in any case, or + * `is not` with several spaces in lower case only. 0 when neither matches. + */ + private function matchIsNot(int $cursor): int { - $start = $this->state->getCursor(); - $status = ScannerStatus::IMPOSSIBLE; - /** @phpstan-ignore identical.alwaysTrue */ - while (ScannerStatus::IMPOSSIBLE === $status) { - $cursor = $this->state->getStart(); - $mode = $this->state->getMode(); - if ($mode === Mode::RAW->value || $mode === Mode::COMMENT->value) { - $next = $this->state->getNext(); - $doubleNext = $this->state->getNext(2); - - if ($cursor === "\n") { - $this->state->incrementActiveLine(); - } - - if ($cursor === null || ($cursor === '{' && ($next === '%' || $next === '{' || $next === '#'))) { - if ($next !== '#') { - $this->state->setMode(Mode::CODE->value); - - if ($this->state->getRawFragment() !== '') { - if ($this->state->getWhitespaceControl()) { - $this->state->setRawFragment(ltrim($this->state->getRawFragment())); - $this->state->setWhitespaceControl(false); - } - - if ($doubleNext === '-') { - $this->state->setRawFragment(rtrim($this->state->getRawFragment())); - } - - $this->token = new Token(Opcode::RAW_FRAGMENT->value, $this->state->getRawFragment()); - - $this->state->setRawFragment(''); - } else { - $this->token = new Token(Opcode::IGNORE->value); - } - } else { - while ($next = $this->state->incrementStart()->getStart()) { - $doubleNext = $this->state->getNext(); - if ($next === '#' && $doubleNext === '}') { - $this->state->incrementStart(2); - $this->token = new Token(Opcode::IGNORE->value); - return ScannerStatus::OK; - } elseif ($next === "\n") { - $this->state->incrementActiveLine(); - } - } - - return ScannerStatus::EOF; - } - - return ScannerStatus::OK; - } - - $this->state->appendToRawFragment($cursor); - $this->state->incrementStart(); - } elseif ($mode === Mode::VERBATIM->value) { - if ($cursor === "\n") { - $this->state->incrementActiveLine(); - } - - /** - * End of input while still inside a verbatim block. Flush - * whatever has been captured so far; the parser then reports - * the missing {% endverbatim %}. - */ - if ($cursor === null) { - $this->state->setMode(Mode::CODE->value); - - if ($this->state->getRawFragment() !== '') { - $this->token = new Token( - Opcode::RAW_FRAGMENT->value, - $this->state->getRawFragment() - ); - $this->state->setRawFragment(''); - - return ScannerStatus::OK; - } - - return ScannerStatus::EOF; - } - - /** - * Detect the closing "{% endverbatim %}" tag, allowing the - * optional "-" whitespace-control marker and surrounding - * spaces. Everything else - including other "{{", "{%" and - * "{#" sequences - is captured as literal content. - */ - if ($cursor === '{' && $this->state->getNext() === '%' && $this->isEndVerbatimAhead()) { - $this->state->setMode(Mode::CODE->value); - - if ($this->state->getRawFragment() !== '') { - $this->token = new Token( - Opcode::RAW_FRAGMENT->value, - $this->state->getRawFragment() - ); - $this->state->setRawFragment(''); - } else { - $this->token = new Token(Opcode::IGNORE->value); - } + return max( + $this->matchLength(self::IS_NOT_ONE_SPACE, $cursor), + $this->matchLength(self::IS_NOT_SPACES, $cursor) + ); + } - /** - * Leave the cursor on "{%" so the {% endverbatim %} tag - * is tokenized on the next scan. - */ - return ScannerStatus::OK; - } + /** + * Length of an anchored match at $cursor that ends before the end of the + * input, or 0. + */ + private function matchLength(string $pattern, int $cursor): int + { + if (preg_match($pattern, $this->code, $matches, 0, $cursor) !== 1) { + return 0; + } - /** - * Literal content: buffer the current character and advance. - */ - $this->state->appendToRawFragment($cursor); - $this->state->incrementStart(); - } else { - $vvch = $cursor; - switch ($vvch) { - case null: - goto vv2; - case "\t": - case "\r": - case ' ': - goto vv6; - case "\n": - goto vv9; - case '!': - goto vv11; - case '"': - goto vv13; - case '%': - goto vv14; - case '\'': - goto vv16; - case '(': - goto vv17; - case ')': - goto vv19; - case '*': - goto vv21; - case '+': - goto vv23; - case ',': - goto vv25; - case '-': - goto vv27; - case '.': - goto vv29; - case '/': - goto vv31; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - goto vv33; - case ':': - goto vv36; - case '<': - goto vv38; - case '=': - goto vv40; - case '>': - goto vv42; - case '?': - goto vv44; - case 'A': - case 'a': - goto vv46; - case 'B': - case 'b': - goto vv48; - case 'C': - case 'c': - goto vv49; - case 'D': - case 'd': - goto vv50; - case 'E': - case 'e': - goto vv51; - case 'F': - case 'f': - goto vv52; - case 'G': - case 'H': - case 'J': - case 'K': - case 'L': - case 'P': - case 'Q': - case 'U': - case 'V': - case 'X': - case 'Y': - case 'Z': - case '_': - case 'g': - case 'h': - case 'j': - case 'k': - case 'l': - case 'p': - case 'q': - case 'u': - case 'v': - case 'x': - case 'y': - case 'z': - goto vv53; - case 'I': - goto vv55; - case 'M': - case 'm': - goto vv56; - case 'N': - case 'n': - goto vv57; - case 'O': - case 'o': - goto vv58; - case 'R': - case 'r': - goto vv59; - case 'S': - case 's': - goto vv60; - case 'T': - case 't': - goto vv61; - case 'W': - case 'w': - goto vv62; - case '[': - goto vv63; - case '\\': - goto vv65; - case ']': - goto vv66; - case 'i': - goto vv68; - case '{': - goto vv69; - case '|': - goto vv71; - case '}': - goto vv73; - case '~': - goto vv75; - default: - goto vv4; - } + $length = strlen($matches[0]); - vv2: - $status = ScannerStatus::EOF; - break; + return $cursor + $length <= $this->end ? $length : 0; + } - vv4: - $this->state->incrementStart(); + /** + * Offset of the next `{{`, `{%` or `{#` at or after $from, or the end. + */ + private function nextTag(int $from): int + { + $position = $from; - vv5: - $status = ScannerStatus::ERR; - break; - vv6: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '\t': - case '\r': - case ' ': - goto vv6; - default: - goto vv8; - } - vv8: - $this->token = new Token(Opcode::IGNORE->value); - return ScannerStatus::OK; - vv9: - $this->state->incrementStart(); - $this->state->incrementActiveLine(); - $this->token = new Token(Opcode::IGNORE->value); - return ScannerStatus::OK; - vv11: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '=': - goto vv77; - default: - goto vv12; - } - vv12: - $this->token = new Token(Opcode::NOT->value); - return ScannerStatus::OK; + while (true) { + $brace = strpos($this->code, '{', $position); + if ($brace === false || $brace >= $this->end) { + return $this->end; + } - vv13: - $vvaccept = 0; - $vvch = $this->state->incrementStart()->getStart(); - $this->state->setMarker($this->state->getCursor()); - if ($vvch === null) { - goto vv5; - } - goto vv80; + $next = $brace + 1 < $this->end ? $this->code[$brace + 1] : "\0"; + if ($next === '%' || $next === '{' || $next === '#') { + return $brace; + } - vv14: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '}': - goto vv85; - default: - goto vv15; - } - vv15: - $this->token = new Token(Opcode::MOD->value); - return ScannerStatus::OK; + $position = $brace + 1; + } + } - vv16: - $vvaccept = 0; - $vvch = $this->state->incrementStart()->getStart(); - $this->state->setMarker($this->state->getCursor()); - if ($vvch === null) { - goto vv5; - } - goto vv88; + /** + * CODE mode: one re2c token. + */ + private function scanCode(): ScannerStatus + { + $cursor = $this->state->getCursor(); - vv17: - $this->state->incrementStart(); - $this->token = new Token(Opcode::PARENTHESES_OPEN->value); - return ScannerStatus::OK; - vv19: - $this->state->incrementStart(); - { - $this->token = new Token(Opcode::PARENTHESES_CLOSE->value); - return ScannerStatus::OK; - } - vv21: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '=': - goto vv90; - default: - goto vv22; - } - vv22: - { - $this->token = new Token(Opcode::MUL->value); - return ScannerStatus::OK; - } - vv23: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '+': - goto vv92; - case '=': - goto vv94; - default: - goto vv24; - } + if ($cursor >= $this->end) { + return ScannerStatus::EOF; + } - vv24: - $this->token = new Token(Opcode::ADD->value); - return ScannerStatus::OK; + $char = $this->code[$cursor]; - vv25: - $this->state->incrementStart(); - $this->token = new Token(Opcode::COMMA->value); - return ScannerStatus::OK; + if ($char === ' ' || $char === "\t" || $char === "\r") { + $length = strspn($this->code, " \t\r", $cursor, $this->end - $cursor); - vv27: - $vvaccept = 1; - $vvch = $this->state->incrementStart()->getStart(); - $this->state->setMarker($this->state->getCursor()); - switch ($vvch) { - case '%': - goto vv96; - case '-': - goto vv97; - case '=': - goto vv99; - case '}': - goto vv101; - default: - goto vv28; - } + return $this->emit(Opcode::IGNORE, $cursor + $length); + } - vv28: - $this->token = new Token(Opcode::SUB->value); - return ScannerStatus::OK; + if ($char === "\n") { + $this->state->incrementActiveLine(); - vv29: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '.': - goto vv102; - default: - goto vv30; - } + return $this->emit(Opcode::IGNORE, $cursor + 1); + } - vv30: - $this->token = new Token(Opcode::DOT->value); - return ScannerStatus::OK; + if ($char >= '0' && $char <= '9') { + $number = substr($this->code, $cursor, $this->matchLength(self::DOUBLE_OR_INTEGER, $cursor)); + $opcode = str_contains($number, '.') ? Opcode::DOUBLE : Opcode::INTEGER; - vv31: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '=': - goto vv104; - default: - goto vv32; - } + return $this->emit($opcode, $cursor + strlen($number), $number); + } - vv32: - $this->token = new Token(Opcode::DIV->value); - return ScannerStatus::OK; + if ($char === '"' || $char === "'") { + return $this->scanString($cursor, $char === '"' ? self::STRING_DOUBLE : self::STRING_SINGLE); + } - vv33: - $vvaccept = 2; - $vvch = $this->state->incrementStart()->getStart(); - $this->state->setMarker($this->state->getCursor()); - switch ($vvch) { - case '.': - goto vv106; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - goto vv33; - default: - goto vv35; - } + if ( + preg_match(self::IDENTIFIER, $this->code, $matches, 0, $cursor) === 1 + && $cursor + strlen($matches[0]) <= $this->end + ) { + return $this->scanWord($cursor, $matches[0]); + } - vv35: - $this->token = new Token( - Opcode::INTEGER->value, - substr($this->state->getRawBuffer(), $start, $this->state->getCursor() - $start) - ); - return ScannerStatus::OK; + foreach (self::OPERATORS[$char] ?? [] as [$operator, $opcode]) { + $length = strlen($operator); + if ($cursor + $length <= $this->end && substr($this->code, $cursor, $length) === $operator) { + return $this->scanOperator($cursor + $length, $operator, $opcode); + } + } - vv36: - $this->state->incrementStart(); - $this->token = new Token(Opcode::COLON->value); - return ScannerStatus::OK; - vv38: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '=': - goto vv107; - case '>': - goto vv109; - default: - goto vv39; - } - vv39: - $this->token = new Token(Opcode::LESS->value); - return ScannerStatus::OK; - vv40: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '=': - goto vv111; - default: - goto vv41; - } - vv41: - { - $this->token = new Token(Opcode::ASSIGN->value); - return ScannerStatus::OK; - } - vv42: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '=': - goto vv113; - default: - goto vv43; - } - vv43: - { - $this->token = new Token(Opcode::GREATER->value); - return ScannerStatus::OK; - } - vv44: - $this->state->incrementStart(); - { - $this->token = new Token(Opcode::QUESTION->value); - return ScannerStatus::OK; - } - vv46: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'N': - case 'n': - goto vv115; - case 'U': - case 'u': - goto vv116; - default: - goto vv54; - } + // [^] - any other byte is a scanning error; the cursor moves past it + $this->state->setCursor($cursor + 1); - vv47: - $this->token = new Token( - Opcode::IDENTIFIER->value, - substr($this->state->getRawBuffer(), $start, $this->state->getCursor() - $start) - ); - return ScannerStatus::OK; + return ScannerStatus::ERR; + } - vv48: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'L': - case 'l': - goto vv117; - case 'R': - case 'r': - goto vv118; - default: - goto vv54; - } - vv49: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'a': - goto vv119; - case 'O': - case 'o': - goto vv120; - default: - goto vv54; - } - vv50: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv121; - case 'O': - case 'o': - goto vv122; - default: - goto vv54; - } - vv51: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'L': - case 'l': - goto vv124; - case 'M': - case 'm': - goto vv125; - case 'N': - case 'n': - goto vv126; - case 'V': - case 'v': - goto vv127; - case 'X': - case 'x': - goto vv128; - default: - goto vv54; - } - vv52: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'a': - goto vv129; - case 'O': - case 'o': - goto vv130; - default: - goto vv54; - } + /** + * Applies the mode / whitespace-control side effects of the delimiter + * rules (scanner.re lines 566-628) and emits the operator token. + */ + private function scanOperator(int $next, string $operator, Opcode $opcode): ScannerStatus + { + switch ($operator) { + case '{%': + case '{%-': + $this->state->setWhitespaceControl(false); + break; - vv53: - $vvch = $this->state->incrementStart()->getStart(); + case '{{': + case '{{-': + $this->state->setWhitespaceControl(false); + $this->state->incrementStatementPosition(); + break; - vv54: - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv47; - } - vv55: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'F': - case 'f': - goto vv131; - case 'N': - case 'n': - goto vv133; - case 'S': - case 's': - goto vv135; - case 'T': - case 't': - goto vv137; - default: - goto vv54; - } - vv56: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'a': - goto vv138; - default: - goto vv54; - } - vv57: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'O': - case 'o': - goto vv139; - case 'U': - case 'u': - goto vv140; - default: - goto vv54; - } - vv58: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'D': - case 'd': - goto vv141; - case 'R': - case 'r': - goto vv142; - default: - goto vv54; - } - vv59: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'a': - goto vv144; - case 'E': - case 'e': - goto vv145; - default: - goto vv54; - } - vv60: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'C': - case 'c': - goto vv146; - case 'E': - case 'e': - goto vv147; - case 'W': - case 'w': - goto vv148; - default: - goto vv54; - } - vv61: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'R': - case 'r': - goto vv149; - default: - goto vv54; - } - vv62: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'I': - case 'i': - goto vv150; - default: - goto vv54; - } - vv63: - $this->state->incrementStart(); - { - $this->token = new Token(Opcode::SBRACKET_OPEN->value); - return ScannerStatus::OK; - } - vv65: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv5; - } - vv66: - $this->state->incrementStart(); - { - $this->token = new Token(Opcode::SBRACKET_CLOSE->value); - return ScannerStatus::OK; - } - vv68: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'F': - case 'f': - goto vv131; - case 'N': - case 'n': - goto vv133; - case 'S': - goto vv135; - case 'T': - case 't': - goto vv137; - case 's': - goto vv151; - default: - goto vv54; - } - vv69: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '%': - goto vv152; - case '{': - goto vv154; - default: - goto vv70; - } - vv70: - { - $this->token = new Token(Opcode::CBRACKET_OPEN->value); - return ScannerStatus::OK; - } - vv71: - $this->state->incrementStart(); - $this->token = new Token(Opcode::PIPE->value); - return ScannerStatus::OK; - vv73: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '}': - goto vv156; - default: - goto vv74; - } - vv74: - { - $this->token = new Token(Opcode::CBRACKET_CLOSE->value); - return ScannerStatus::OK; - } - vv75: - $this->state->incrementStart(); - { - $this->token = new Token(Opcode::CONCAT->value); - return ScannerStatus::OK; - } - vv77: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '=': - goto vv158; - default: - goto vv78; - } - vv78: - { - $this->token = new Token(Opcode::NOTEQUALS->value); - return ScannerStatus::OK; + case '%}': + case '-%}': + if ($this->state->isVerbatim()) { + $this->state->setMode(Mode::VERBATIM); + $this->state->setVerbatim(false); + } else { + $this->state->setMode(Mode::RAW); } - vv79: - $vvch = $this->state->incrementStart()->getStart(); - vv80: - switch ($vvch) { - case null: - goto vv81; - case '"': - goto vv82; - case '\\': - goto vv84; - default: - goto vv79; + if ($operator === '-%}') { + $this->state->setWhitespaceControl(true); } + break; - vv81: - $this->state->setCursor((int) $this->state->getMarker()); - switch ($vvaccept) { - case 0: - goto vv5; - case 1: - goto vv28; - case 2: - goto vv35; - default: - goto vv136; + case '}}': + case '-}}': + $this->state->setMode(Mode::RAW); + $this->state->setVerbatim(false); + if ($operator === '-}}') { + $this->state->setWhitespaceControl(true); } + break; + } - vv82: - $this->state->incrementStart(); - $start++; - $this->token = new Token( - Opcode::STRING->value, - substr($this->state->getRawBuffer(), $start, $this->state->getCursor() - $start - 1) - ); - return ScannerStatus::OK; - vv84: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case "\n": - goto vv81; - default: - goto vv79; - } - vv85: - $this->state->incrementStart(); - if ($this->state->getVerbatim() === 1) { - $this->state->setMode(Mode::VERBATIM->value); - $this->state->setVerbatim(0); - } else { - $this->state->setMode(Mode::RAW->value); - } - $this->token = new Token(Opcode::CLOSE_DELIMITER->value); - return ScannerStatus::OK; - vv87: - $vvch = $this->state->incrementStart()->getStart(); - vv88: - switch ($vvch) { - case null: - goto vv81; - case '\'': - goto vv82; - case '\\': - goto vv89; - default: - goto vv87; - } - vv89: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case "\n": - goto vv81; - default: - goto vv87; - } - vv90: - $this->state->incrementStart(); - { - $this->token = new Token(Opcode::MUL_ASSIGN->value); - return ScannerStatus::OK; - } - vv92: - $this->state->incrementStart(); - { - $this->token = new Token(Opcode::INCR->value); - return ScannerStatus::OK; - } - vv94: - $this->state->incrementStart(); - { - $this->token = new Token(Opcode::ADD_ASSIGN->value); - return ScannerStatus::OK; - } - vv96: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '}': - goto vv160; - default: - goto vv81; - } + return $this->emit($opcode, $next); + } - vv97: - $this->state->incrementStart(); - $this->token = new Token(Opcode::DECR->value); - return ScannerStatus::OK; + /** + * RAW mode (scanner.re lines 88-155): buffer text up to the next tag or + * the end of input, swallowing comments. + */ + private function scanRaw(): ScannerStatus + { + $cursor = $this->state->getCursor(); + $stop = $this->nextTag($cursor); - vv99: - $this->state->incrementStart(); - $this->token = new Token(Opcode::SUB_ASSIGN->value); - return ScannerStatus::OK; + if ($stop > $cursor) { + $this->consumeRaw($cursor, $stop); + } - vv101: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '}': - goto vv162; - default: - goto vv81; - } + if ($stop >= $this->end || $this->code[$stop + 1] !== '#') { + return $this->flushRaw($stop); + } - vv102: - $this->state->incrementStart(); - $this->token = new Token(Opcode::RANGE->value); - return ScannerStatus::OK; + return $this->skipComment($stop); + } - vv104: - $this->state->incrementStart(); - $this->token = new Token(Opcode::DIV_ASSIGN->value); - return ScannerStatus::OK; + /** + * A quoted string. The value keeps its escape sequences verbatim. A string + * that is never closed - or whose last byte is a lone backslash - does not + * match, which makes its opening quote a scanning error. + */ + private function scanString(int $cursor, string $pattern): ScannerStatus + { + if ( + preg_match($pattern, $this->code, $matches, 0, $cursor) !== 1 + || $cursor + strlen($matches[0]) > $this->end + ) { + $this->state->setCursor($cursor + 1); - vv106: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - goto vv164; - default: - goto vv81; - } - vv107: - $this->state->incrementStart(); - { - $this->token = new Token(Opcode::LESSEQUAL->value); - return ScannerStatus::OK; - } - vv109: - $this->state->incrementStart(); - { - $this->token = new Token(Opcode::NOTEQUALS->value); - return ScannerStatus::OK; - } - vv111: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '=': - goto vv167; - default: - goto vv112; - } - vv112: - { - $this->token = new Token(Opcode::EQUALS->value); - return ScannerStatus::OK; - } - vv113: - $this->state->incrementStart(); - { - $this->token = new Token(Opcode::GREATEREQUAL->value); - return ScannerStatus::OK; - } - vv115: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'D': - case 'd': - goto vv169; - default: - goto vv54; - } - vv116: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'T': - case 't': - goto vv171; - default: - goto vv54; - } - vv117: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'O': - case 'o': - goto vv172; - default: - goto vv54; - } - vv118: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv173; - default: - goto vv54; - } - vv119: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'C': - case 'c': - goto vv174; - case 'L': - case 'l': - goto vv175; - case 'S': - case 's': - goto vv176; - default: - goto vv54; - } - vv120: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'N': - case 'n': - goto vv177; - default: - goto vv54; - } - vv121: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'F': - case 'f': - goto vv178; - default: - goto vv54; - } - vv122: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv123; - } + return ScannerStatus::ERR; + } - vv123: - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::DO->value); - return ScannerStatus::OK; + $literal = $matches[0]; - vv124: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'S': - case 's': - goto vv179; - default: - goto vv54; - } - vv125: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'P': - case 'p': - goto vv180; - default: - goto vv54; - } - vv126: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'D': - case 'd': - goto vv181; - default: - goto vv54; - } - vv127: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv182; - default: - goto vv54; - } - vv128: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'T': - case 't': - goto vv183; - default: - goto vv54; - } - vv129: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'L': - case 'l': - goto vv184; - default: - goto vv54; - } - vv130: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'R': - case 'r': - goto vv185; - default: - goto vv54; - } - vv131: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv132; - } - vv132: - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::IF->value); - return ScannerStatus::OK; - } - vv133: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - case 'C': - case 'c': - goto vv187; - default: - goto vv134; - } + return $this->emit(Opcode::STRING, $cursor + strlen($literal), substr($literal, 1, -1)); + } - vv134: - $this->token = new Token(Opcode::IN->value); - return ScannerStatus::OK; + /** + * VERBATIM mode (scanner.re lines 157-260): capture text literally up to + * `{% endverbatim %}` (optional `-`, spaces and any letter case). The + * cursor stays on that tag so CODE mode tokenizes it next. + */ + private function scanVerbatim(): ScannerStatus + { + $cursor = $this->state->getCursor(); + $position = $cursor; + $stop = $this->end; + + while (($open = strpos($this->code, '{%', $position)) !== false && $open < $this->end) { + if ( + preg_match(self::ENDVERBATIM, $this->code, $matches, 0, $open) === 1 + && $open + strlen($matches[0]) <= $this->end + ) { + $stop = $open; + break; + } - vv135: - $vvaccept = 3; - $vvch = $this->state->incrementStart()->getStart(); - $this->state->setMarker($this->state->getCursor()); - switch ($vvch) { - case ' ': - goto vv188; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv136; - } + $position = $open + 1; + } - vv136: - if ($this->state->getActiveToken() === Opcode::DOT->value) { - $this->token = new Token( - Opcode::IDENTIFIER->value, - substr($this->state->getRawBuffer(), $start, $this->state->getCursor() - $start) - ); - } else { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::IS->value); - } + if ($stop > $cursor) { + $this->consumeRaw($cursor, $stop); + } - return ScannerStatus::OK; + $this->state->setMode(Mode::CODE); + $fragment = $this->state->getRawFragment(); - vv137: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv189; - default: - goto vv54; - } - vv138: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'C': - case 'c': - goto vv190; - default: - goto vv54; - } - vv139: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'T': - case 't': - goto vv191; - default: - goto vv54; - } - vv140: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'L': - case 'l': - goto vv193; - case 'M': - case 'm': - goto vv194; - default: - goto vv54; - } - vv141: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'D': - case 'd': - goto vv195; - default: - goto vv54; - } - vv142: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv143; - } - vv143: - { - $this->token = new Token(Opcode::OR->value); - return ScannerStatus::OK; - } - vv144: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'W': - case 'w': - goto vv197; - default: - goto vv54; - } - vv145: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'T': - case 't': - goto vv199; - default: - goto vv54; - } - vv146: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'a': - goto vv200; - default: - goto vv54; - } - vv147: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'T': - case 't': - goto vv201; - default: - goto vv54; - } - vv148: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'I': - case 'i': - goto vv203; - default: - goto vv54; - } - vv149: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'U': - case 'u': - goto vv204; - default: - goto vv54; - } - vv150: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'T': - case 't': - goto vv205; - default: - goto vv54; - } - vv151: - $vvaccept = 3; - $vvch = $this->state->incrementStart()->getStart(); - $this->state->setMarker($this->state->getCursor()); - switch ($vvch) { - case ' ': - goto vv206; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv136; - } - vv152: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '-': - goto vv207; - default: - goto vv153; - } - - vv153: - $this->state->setWhitespaceControl(false); - $this->token = new Token(Opcode::OPEN_DELIMITER->value); - return ScannerStatus::OK; + if ($fragment === '') { + if ($stop >= $this->end) { + return ScannerStatus::EOF; + } - vv154: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '-': - goto vv209; - default: - goto vv155; - } + $this->token = new Token(Opcode::IGNORE->value); - vv155: - $this->state->setWhitespaceControl(false); - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::OPEN_EDELIMITER->value); - return ScannerStatus::OK; + return ScannerStatus::OK; + } - vv156: - $this->state->incrementStart(); - $this->state->setMode(Mode::RAW->value); - $this->state->setVerbatim(0); - $this->token = new Token(Opcode::CLOSE_EDELIMITER->value); - return ScannerStatus::OK; - vv158: - $this->state->incrementStart(); - $this->token = new Token(Opcode::NOTIDENTICAL->value); - return ScannerStatus::OK; + $this->state->setRawFragment(''); + $this->token = new Token(Opcode::RAW_FRAGMENT->value, $fragment); - vv160: - $this->state->incrementStart(); - if ($this->state->getVerbatim() === 1) { - $this->state->setMode(Mode::VERBATIM->value); - $this->state->setVerbatim(0); - } else { - $this->state->setMode(Mode::RAW->value); - } - $this->state->setWhitespaceControl(true); - $this->token = new Token(Opcode::CLOSE_DELIMITER->value); - return ScannerStatus::OK; + return ScannerStatus::OK; + } - vv162: - $this->state->incrementStart(); - $this->state->setMode(Mode::RAW->value); - $this->state->setWhitespaceControl(true); - $this->state->setVerbatim(0); - $this->token = new Token(Opcode::CLOSE_EDELIMITER->value); - return ScannerStatus::OK; - vv164: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - goto vv164; - default: - goto vv166; - } - vv166: - { - $this->token = new Token( - Opcode::DOUBLE->value, - substr($this->state->getRawBuffer(), $start, $this->state->getCursor() - $start) - ); - return ScannerStatus::OK; - } - vv167: - $this->state->incrementStart(); - { - $this->token = new Token(Opcode::IDENTICAL->value); - return ScannerStatus::OK; - } - vv169: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv170; - } - vv170: - { - $this->token = new Token(Opcode::AND->value); - return ScannerStatus::OK; - } - vv171: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'O': - case 'o': - goto vv211; - default: - goto vv54; - } - vv172: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'C': - case 'c': - goto vv212; - default: - goto vv54; - } - vv173: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'a': - goto vv213; - default: - goto vv54; - } - vv174: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'H': - case 'h': - goto vv214; - default: - goto vv54; - } - vv175: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'L': - case 'l': - goto vv215; - default: - goto vv54; - } - vv176: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv217; - default: - goto vv54; - } - vv177: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'T': - case 't': - goto vv219; - default: - goto vv54; - } - vv178: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'a': - goto vv220; - case 'I': - case 'i': - goto vv221; - default: - goto vv54; - } - vv179: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv222; - default: - goto vv54; - } - vv180: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'T': - case 't': - goto vv224; - default: - goto vv54; - } - vv181: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'a': - goto vv225; - case 'B': - case 'b': - goto vv226; - case 'C': - case 'c': - goto vv227; - case 'F': - case 'f': - goto vv228; - case 'I': - case 'i': - goto vv229; - case 'M': - case 'm': - goto vv230; - case 'R': - case 'r': - goto vv231; - case 'S': - case 's': - goto vv232; - default: - goto vv54; - } - vv182: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'N': - case 'n': - goto vv233; - default: - goto vv54; - } - vv183: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv235; - default: - goto vv54; - } - vv184: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'S': - case 's': - goto vv236; - default: - goto vv54; - } - vv185: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv186; - } - vv186: - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::FOR->value); - return ScannerStatus::OK; - } - vv187: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'L': - case 'l': - goto vv237; - default: - goto vv54; - } - vv188: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'N': - case 'n': - goto vv238; - default: - goto vv81; - } - vv189: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'R': - case 'r': - goto vv239; - default: - goto vv54; - } - vv190: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'R': - case 'r': - goto vv240; - default: - goto vv54; - } - vv191: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv192; - } - vv192: - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::NOT->value); - return ScannerStatus::OK; - } - vv193: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'L': - case 'l': - goto vv241; - default: - goto vv54; - } - vv194: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv243; - default: - goto vv54; - } - vv195: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv196; - } + /** + * A keyword or an identifier (they tie on length and the keyword wins), + * plus the two `is not` spellings, which are longer than `is`. + */ + private function scanWord(int $cursor, string $word): ScannerStatus + { + $keyword = strtolower($word); - vv196: + if ($keyword === 'is') { + $isNot = $this->matchIsNot($cursor); + if ($isNot > 0) { $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::ODD->value); - return ScannerStatus::OK; - vv197: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv198; - } - vv198: - $this->token = new Token( - Opcode::IDENTIFIER->value, - substr($this->state->getRawBuffer(), $start, $this->state->getCursor() - $start) - ); - return ScannerStatus::OK; - vv199: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'U': - case 'u': - goto vv244; - default: - goto vv54; - } - vv200: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'L': - case 'l': - goto vv245; - default: - goto vv54; - } - vv201: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv202; - } - vv202: - { - if ($this->state->getActiveToken() === Opcode::DOT->value) { - $this->token = new Token( - Opcode::IDENTIFIER->value, - substr($this->state->getRawBuffer(), $start, $this->state->getCursor() - $start) - ); - } else { - $this->token = new Token(Opcode::SET->value); - } + return $this->emit(Opcode::NOTEQUALS, $cursor + $isNot); + } + } - return ScannerStatus::OK; - } - vv203: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'T': - case 't': - goto vv246; - default: - goto vv54; - } - vv204: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv247; - default: - goto vv54; - } - vv205: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'H': - case 'h': - goto vv249; - default: - goto vv54; - } + $next = $cursor + strlen($word); + $opcode = self::KEYWORDS[$keyword] ?? null; - vv206: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'N': - case 'n': - goto vv238; - default: - goto vv252; - } + if ($opcode === null) { + return $this->emit(Opcode::IDENTIFIER, $next, $word); + } - vv207: - $this->state->incrementStart(); - $this->state->setWhitespaceControl(false); - $this->token = new Token(Opcode::OPEN_DELIMITER->value); - return ScannerStatus::OK; + $afterDot = $this->state->getActiveToken() === Opcode::DOT->value; - vv209: - $this->state->incrementStart(); - $this->state->setWhitespaceControl(false); - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::OPEN_EDELIMITER->value); - return ScannerStatus::OK; + // `.set` and `.is` are property names, not keywords + if (($opcode === Opcode::SET || $opcode === Opcode::IS) && $afterDot) { + return $this->emit(Opcode::IDENTIFIER, $next, $word); + } - vv211: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv253; - default: - goto vv54; - } - vv212: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'K': - case 'k': - goto vv254; - default: - goto vv54; - } - vv213: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'K': - case 'k': - goto vv256; - default: - goto vv54; - } - vv214: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv258; - default: - goto vv54; - } - vv215: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv216; - } - vv216: - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::CALL->value); - return ScannerStatus::OK; - } - vv217: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv218; - } - vv218: - { - $this->token = new Token(Opcode::CASE->value); - return ScannerStatus::OK; - } - vv219: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'I': - case 'i': - goto vv260; - default: - goto vv54; - } - vv220: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'U': - case 'u': - goto vv261; - default: - goto vv54; - } - vv221: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'N': - case 'n': - goto vv262; - default: - goto vv54; - } - vv222: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'G': - case 'H': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'g': - case 'h': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - case 'F': - case 'f': - goto vv263; - case 'I': - case 'i': - goto vv264; - default: - goto vv223; - } - vv223: - { - $this->token = new Token(Opcode::ELSE->value); - return ScannerStatus::OK; - } - vv224: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'Y': - case 'y': - goto vv265; - default: - goto vv54; - } - vv225: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'U': - case 'u': - goto vv267; - default: - goto vv54; - } - vv226: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'L': - case 'l': - goto vv268; - default: - goto vv54; - } - vv227: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'a': - goto vv269; - default: - goto vv54; - } - vv228: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'O': - case 'o': - goto vv270; - default: - goto vv54; - } - vv229: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'F': - case 'f': - goto vv271; - default: - goto vv54; - } - vv230: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'a': - goto vv273; - default: - goto vv54; - } - vv231: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'a': - goto vv274; - default: - goto vv54; - } - vv232: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'W': - case 'w': - goto vv275; - default: - goto vv54; - } - vv233: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv234; - } + if (isset(self::COUNTS_AS_STATEMENT[$keyword])) { + $this->state->incrementStatementPosition(); + } - vv234: - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::EVEN->value); - return ScannerStatus::OK; + if ($opcode === Opcode::VERBATIM) { + $this->state->setVerbatim(true); + } - vv235: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'N': - case 'n': - goto vv276; - default: - goto vv54; - } - vv236: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv277; - default: - goto vv54; - } - vv237: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'U': - case 'u': - goto vv279; - default: - goto vv54; - } - vv238: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'O': - case 'o': - goto vv280; - default: - goto vv81; - } - vv239: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'a': - goto vv281; - default: - goto vv54; - } - vv240: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'O': - case 'o': - goto vv282; - default: - goto vv54; - } - vv241: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv242; - } - vv242: - { - $this->token = new Token(Opcode::NULL->value); - return ScannerStatus::OK; - } - vv243: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'R': - case 'r': - goto vv284; - default: - goto vv54; - } - vv244: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'R': - case 'r': - goto vv285; - default: - goto vv54; - } - vv245: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'a': - goto vv286; - default: - goto vv54; - } - vv246: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'C': - case 'c': - goto vv287; - default: - goto vv54; - } - vv247: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv248; - } - vv248: - { - $this->token = new Token(Opcode::TRUE->value); - return ScannerStatus::OK; - } - vv249: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv250; - } - vv250: - { - $this->token = new Token(Opcode::WITH->value); - return ScannerStatus::OK; - } - vv251: - $vvch = $this->state->incrementStart()->getStart(); - vv252: - switch ($vvch) { - case ' ': - goto vv251; - case 'n': - goto vv288; - default: - goto vv81; - } - vv253: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'S': - case 's': - goto vv289; - default: - goto vv54; - } - vv254: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv255; - } + // `default` keeps its spelling: the driver may turn it back into an identifier + return $this->emit($opcode, $next, $opcode === Opcode::DEFAULT ? $word : null); + } - vv255: - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::BLOCK->value); - return ScannerStatus::OK; + /** + * Swallows a `{# ... #}` comment starting at $open. Emits IGNORE when it + * is closed, EOF when the input ends first; the raw buffer is untouched in + * both cases, so text around a comment joins into one fragment. A + * comment's own `#` may close it: `{#}` is complete. + */ + private function skipComment(int $open): ScannerStatus + { + $close = strpos($this->code, '#}', $open + 1); - vv256: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv257; - } - vv257: - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::BREAK->value); - return ScannerStatus::OK; - } - vv258: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv47; - } - vv260: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'N': - case 'n': - goto vv290; - default: - goto vv54; - } - vv261: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'L': - case 'l': - goto vv291; - default: - goto vv54; - } - vv262: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv292; - default: - goto vv54; - } - vv263: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'O': - case 'o': - goto vv293; - default: - goto vv54; - } - vv264: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'F': - case 'f': - goto vv294; - default: - goto vv54; - } - vv265: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv266; - } - vv266: - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::EMPTY->value); - return ScannerStatus::OK; - } - vv267: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'T': - case 't': - goto vv296; - default: - goto vv54; - } - vv268: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'O': - case 'o': - goto vv297; - default: - goto vv54; - } - vv269: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'C': - case 'c': - goto vv298; - case 'L': - case 'l': - goto vv299; - default: - goto vv54; - } - vv270: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'R': - case 'r': - goto vv300; - default: - goto vv54; - } - vv271: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv272; - } - vv272: - { - $this->token = new Token(Opcode::ENDIF->value); - return ScannerStatus::OK; - } - vv273: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'C': - case 'c': - goto vv302; - default: - goto vv54; - } - vv274: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'W': - case 'w': - goto vv303; - default: - goto vv54; - } - vv275: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'I': - case 'i': - goto vv305; - default: - goto vv54; - } - vv276: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'D': - case 'd': - goto vv306; - default: - goto vv54; - } - vv277: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv278; - } - vv278: - { - $this->token = new Token(Opcode::FALSE->value); - return ScannerStatus::OK; - } - vv279: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'D': - case 'd': - goto vv307; - default: - goto vv54; - } - vv280: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'T': - case 't': - goto vv308; - default: - goto vv81; - } - vv281: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'B': - case 'b': - goto vv310; - default: - goto vv54; - } - vv282: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv283; - } - vv283: - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::MACRO->value); - return ScannerStatus::OK; - } - vv284: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'I': - case 'i': - goto vv311; - default: - goto vv54; - } - vv285: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'N': - case 'n': - goto vv312; - default: - goto vv54; - } - vv286: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'R': - case 'r': - goto vv314; - default: - goto vv54; - } - vv287: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'H': - case 'h': - goto vv316; - default: - goto vv54; - } - vv288: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'o': - goto vv318; - default: - goto vv81; - } - vv289: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'C': - case 'c': - goto vv319; - default: - goto vv54; - } - vv290: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'U': - case 'u': - goto vv320; - default: - goto vv54; - } - vv291: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'T': - case 't': - goto vv321; - default: - goto vv54; - } - vv292: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'D': - case 'd': - goto vv323; - default: - goto vv54; - } - vv293: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'R': - case 'r': - goto vv325; - default: - goto vv54; - } - vv294: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv295; - } - vv295: - { - $this->token = new Token(Opcode::ELSEIF->value); - return ScannerStatus::OK; - } - vv296: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'O': - case 'o': - goto vv327; - default: - goto vv54; - } - vv297: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'C': - case 'c': - goto vv328; - default: - goto vv54; - } - vv298: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'H': - case 'h': - goto vv329; - default: - goto vv54; - } - vv299: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'L': - case 'l': - goto vv330; - default: - goto vv54; - } - vv300: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv301; - } - vv301: - { - $this->token = new Token(Opcode::ENDFOR->value); - return ScannerStatus::OK; - } - vv302: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'R': - case 'r': - goto vv332; - default: - goto vv54; - } - vv303: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv304; - } - vv304: - $this->token = new Token( - Opcode::IDENTIFIER->value, - substr($this->state->getRawBuffer(), $start, $this->state->getCursor() - $start) - ); - return ScannerStatus::OK; - vv305: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'T': - case 't': - goto vv333; - default: - goto vv54; - } - vv306: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'S': - case 's': - goto vv334; - default: - goto vv54; - } - vv307: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv336; - default: - goto vv54; - } - vv308: - $this->state->incrementStart(); - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::NOTEQUALS->value); - return ScannerStatus::OK; - } - vv310: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'L': - case 'l': - goto vv338; - default: - goto vv54; - } - vv311: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'C': - case 'c': - goto vv339; - default: - goto vv54; - } - vv312: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv313; - } - vv313: - { - $this->token = new Token(Opcode::RETURN->value); - return ScannerStatus::OK; - } - vv314: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv315; - } - vv315: - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::SCALAR->value); - return ScannerStatus::OK; - } - vv316: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv317; - } - vv317: - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::SWITCH->value); - return ScannerStatus::OK; - } - vv318: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 't': - goto vv341; - default: - goto vv81; - } - vv319: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'a': - goto vv343; - default: - goto vv54; - } - vv320: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv344; - default: - goto vv54; - } - vv321: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv322; - } - vv322: - $this->token = new Token( - Opcode::DEFAULT->value, - substr($this->state->getRawBuffer(), $start, $this->state->getCursor() - $start) - ); - return ScannerStatus::OK; - vv323: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv324; - } - vv324: - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::DEFINED->value); - return ScannerStatus::OK; - } - vv325: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv326; - } - vv326: - { - $this->token = new Token(Opcode::ELSEFOR->value); - return ScannerStatus::OK; - } - vv327: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv346; - default: - goto vv54; - } - vv328: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'K': - case 'k': - goto vv347; - default: - goto vv54; - } - vv329: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv349; - default: - goto vv54; - } - vv330: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv331; - } - vv331: - { - $this->token = new Token(Opcode::ENDCALL->value); - return ScannerStatus::OK; - } - vv332: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'O': - case 'o': - goto vv351; - default: - goto vv54; - } - vv333: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'C': - case 'c': - goto vv353; - default: - goto vv54; - } - vv334: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv335; - } - vv335: - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::EXTENDS->value); - return ScannerStatus::OK; + if ($close === false || $close + 1 >= $this->end) { + $this->state->incrementActiveLine( + substr_count($this->code, "\n", $open, $this->end - $open) + ); - vv336: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv337; - } - vv337: - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::INCLUDE->value); - return ScannerStatus::OK; - } - vv338: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv354; - default: - goto vv54; - } - vv339: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv340; - } - vv340: - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::NUMERIC->value); - return ScannerStatus::OK; - } - vv341: - $this->state->incrementStart(); - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::NOTEQUALS->value); - return ScannerStatus::OK; - } - vv343: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'P': - case 'p': - goto vv356; - default: - goto vv54; - } - vv344: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv345; - } - vv345: - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::CONTINUE->value); - return ScannerStatus::OK; - } - vv346: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'S': - case 's': - goto vv357; - default: - goto vv54; - } - vv347: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv348; - } - vv348: - { - $this->token = new Token(Opcode::ENDBLOCK->value); - return ScannerStatus::OK; - } - vv349: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv47; - } - vv351: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv352; - } - vv352: - { - $this->token = new Token(Opcode::ENDMACRO->value); - return ScannerStatus::OK; - } - vv353: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'H': - case 'h': - goto vv358; - default: - goto vv54; - } - vv354: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv355; - } - vv355: - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::ITERABLE->value); - return ScannerStatus::OK; - } - vv356: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv360; - default: - goto vv54; - } - vv357: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'C': - case 'c': - goto vv362; - default: - goto vv54; - } - vv358: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv359; - } - vv359: - { - $this->token = new Token(Opcode::ENDSWITCH->value); - return ScannerStatus::OK; - } - vv360: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv361; - } - vv361: - { - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::AUTOESCAPE->value); - return ScannerStatus::OK; - } - vv362: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'A': - case 'a': - goto vv363; - default: - goto vv54; - } - vv363: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'P': - case 'p': - goto vv364; - default: - goto vv54; - } - vv364: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case 'E': - case 'e': - goto vv365; - default: - goto vv54; - } - vv365: - $vvch = $this->state->incrementStart()->getStart(); - switch ($vvch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '\\': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto vv53; - default: - goto vv366; - } - vv366: - $this->state->incrementStatementPosition(); - $this->token = new Token(Opcode::ENDAUTOESCAPE->value); - return ScannerStatus::OK; - } + return ScannerStatus::EOF; } - return $status; + $this->state->incrementActiveLine(substr_count($this->code, "\n", $open, $close - $open)); + $this->state->setCursor($close + 2); + $this->token = new Token(Opcode::IGNORE->value); + + return ScannerStatus::OK; } } diff --git a/src/Scanner/State.php b/src/Scanner/State.php index af19d6a..43adddf 100644 --- a/src/Scanner/State.php +++ b/src/Scanner/State.php @@ -13,119 +13,54 @@ namespace Phalcon\Volt\Scanner; -class State +/** + * The scanner's position and mode - the scanner half of cphalcon's + * `phvolt_scanner_state`. The parser-driver half (block levels, extends + * mode, ...) lives in Phalcon\Volt\Parser\TokenStream. + * + * Two values are shared with the driver: the active token (set by the + * driver after every token; the scanner reads it to tell `a.set` from + * `{% set %}`) and the statement position (counted by both; the driver uses + * it to require `{% extends %}` to come first). + */ +final class State { - protected string $activeFile = 'eval code'; - - protected int $activeLine = 1; - - protected ?int $activeToken = null; - - protected int $blockLevel = 0; - - protected int $cursor = 0; - - protected ?string $end = null; - - protected int $extendsMode = 0; - - protected int $forcedRawState = 0; - - protected int $forLevel = 0; - - protected int $ifLevel = 0; - - protected int $macroLevel = 0; - - protected ?int $marker = null; - - protected int $mode; + private int $activeLine = 1; - protected int $oldIfLevel = 0; + private ?int $activeToken = null; - protected string $rawBuffer; + private int $cursor = 0; - protected int $rawBufferCursor = 0; + private Mode $mode = Mode::RAW; - protected string $rawFragment = ''; + /** + * Raw text collected since the last fragment was emitted. + */ + private string $rawFragment = ''; - protected ?string $start = null; + private int $statementPosition = 0; - protected int $startLength; - - protected int $statementPosition = 0; - - protected int $switchLevel = 0; - - protected int $verbatim = 0; + /** + * Set by `{% verbatim`: the closing `%}` switches to VERBATIM mode. + */ + private bool $verbatim = false; + /** + * Set by `-%}` / `-}}`: left-trim the next raw fragment. + */ private bool $whitespaceControl = false; - public function __construct(string $buffer) - { - $this->rawBuffer = $buffer; - $this->startLength = mb_strlen($buffer); - $this->mode = Mode::RAW->value; - if ($this->startLength > 0) { - $this->setStart($buffer[0]); - $this->setEnd($buffer[0]); - } - } - - public function appendToRawFragment(string $value): self - { - $this->rawFragment .= $value; - - return $this; - } - - public function decrementBlockLevel(): self + public function __construct(private readonly string $code) { - $this->blockLevel--; - - return $this; } - public function decrementForcedRawState(): self + public function appendToRawFragment(string $text): self { - $this->forcedRawState--; + $this->rawFragment .= $text; return $this; } - public function decrementForLevel(): self - { - $this->forLevel--; - - return $this; - } - - public function decrementIfLevel(): self - { - $this->ifLevel--; - - return $this; - } - - public function decrementMacroLevel(): self - { - $this->macroLevel--; - - return $this; - } - - public function decrementSwitchLevel(): self - { - $this->switchLevel--; - - return $this; - } - - public function getActiveFile(): string - { - return $this->activeFile; - } - public function getActiveLine(): int { return $this->activeLine; @@ -136,9 +71,9 @@ public function getActiveToken(): ?int return $this->activeToken; } - public function getBlockLevel(): int + public function getCode(): string { - return $this->blockLevel; + return $this->code; } public function getCursor(): int @@ -146,154 +81,29 @@ public function getCursor(): int return $this->cursor; } - public function getExtendsMode(): int - { - return $this->extendsMode; - } - - public function getForcedRawState(): int - { - return $this->forcedRawState; - } - - public function getForLevel(): int - { - return $this->forLevel; - } - - public function getIfLevel(): int - { - return $this->ifLevel; - } - - public function getMacroLevel(): int - { - return $this->macroLevel; - } - - public function getMarker(): ?int - { - return $this->marker; - } - - public function getMode(): int + public function getMode(): Mode { return $this->mode; } - public function getNext(int $increment = 1): ?string - { - return $this->rawBuffer[$this->cursor + $increment] ?? null; - } - - public function getOldIfLevel(): int - { - return $this->oldIfLevel; - } - - public function getPrevious(int $decrement = 1): ?string - { - return $this->rawBuffer[$this->cursor - $decrement] ?? null; - } - - public function getRawBuffer(): string - { - return $this->rawBuffer; - } - - public function getRawBufferCursor(): int - { - return $this->rawBufferCursor; - } - public function getRawFragment(): string { return $this->rawFragment; } - public function getStart(): ?string - { - return $this->start; - } - - public function getStartLength(): int - { - return $this->startLength; - } - public function getStatementPosition(): int { return $this->statementPosition; } - public function getSwitchLevel(): int - { - return $this->switchLevel; - } - - public function getVerbatim(): int - { - return $this->verbatim; - } - public function getWhitespaceControl(): bool { return $this->whitespaceControl; } - public function incrementActiveLine(): self - { - $this->activeLine++; - - return $this; - } - - public function incrementBlockLevel(): self - { - $this->blockLevel++; - - return $this; - } - - public function incrementForcedRawState(): self - { - $this->forcedRawState++; - - return $this; - } - - public function incrementForLevel(): self - { - $this->forLevel++; - - return $this; - } - - public function incrementIfLevel(): self + public function incrementActiveLine(int $lines = 1): self { - $this->ifLevel++; - - return $this; - } - - public function incrementMacroLevel(): self - { - $this->macroLevel++; - - return $this; - } - - public function incrementRawBufferCursor(): self - { - $this->rawBufferCursor++; - - return $this; - } - - public function incrementStart(int $value = 1): self - { - $this->cursor += $value; - $this->setStart($this->rawBuffer[$this->cursor] ?? null); + $this->activeLine += $lines; return $this; } @@ -305,25 +115,9 @@ public function incrementStatementPosition(): self return $this; } - public function incrementSwitchLevel(): self - { - $this->switchLevel++; - - return $this; - } - - public function setActiveFile(string $activeFile): self - { - $this->activeFile = $activeFile; - - return $this; - } - - public function setActiveLine(int $activeLine): self + public function isVerbatim(): bool { - $this->activeLine = $activeLine; - - return $this; + return $this->verbatim; } public function setActiveToken(?int $activeToken): self @@ -333,105 +127,20 @@ public function setActiveToken(?int $activeToken): self return $this; } - public function setBlockLevel(int $blockLevel): self - { - $this->blockLevel = $blockLevel; - - return $this; - } - public function setCursor(int $cursor): self { $this->cursor = $cursor; - $this->setStart($this->rawBuffer[$this->cursor] ?? null); - - return $this; - } - - public function setEnd(?string $end): self - { - $this->end = $end; - - return $this; - } - - public function setExtendsMode(int $extendsMode): self - { - $this->extendsMode = $extendsMode; - - return $this; - } - - public function setForcedRawState(int $forcedRawState): self - { - $this->forcedRawState = $forcedRawState; - - return $this; - } - - public function setForLevel(int $forLevel): self - { - $this->forLevel = $forLevel; return $this; } - public function setIfLevel(int $ifLevel): self - { - $this->ifLevel = $ifLevel; - - return $this; - } - - public function setMacroLevel(int $macroLevel): self - { - $this->macroLevel = $macroLevel; - - return $this; - } - - public function setMarker(int $marker): self - { - $this->marker = $marker; - - return $this; - } - - public function setMarkerCursor(int $cursor): self - { - $this->cursor = $cursor; - - return $this; - } - - public function setMode(int $mode): self + public function setMode(Mode $mode): self { $this->mode = $mode; return $this; } - public function setOldIfLevel(int $oldIfLevel): self - { - $this->oldIfLevel = $oldIfLevel; - - return $this; - } - - public function setRawBuffer(string $rawBuffer): self - { - $this->rawBuffer = $rawBuffer; - - return $this; - } - - public function setRawBufferCursor(int $rawBufferCursor): self - { - $this->rawBufferCursor = $rawBufferCursor; - - return $this; - } - public function setRawFragment(string $rawFragment): self { $this->rawFragment = $rawFragment; @@ -439,35 +148,7 @@ public function setRawFragment(string $rawFragment): self return $this; } - public function setStart(?string $start): self - { - $this->start = $start; - - return $this; - } - - public function setStartLength(int $startLength): self - { - $this->startLength = $startLength; - - return $this; - } - - public function setStatementPosition(int $statementPosition): self - { - $this->statementPosition = $statementPosition; - - return $this; - } - - public function setSwitchLevel(int $switchLevel): self - { - $this->switchLevel = $switchLevel; - - return $this; - } - - public function setVerbatim(int $verbatim): self + public function setVerbatim(bool $verbatim): self { $this->verbatim = $verbatim; diff --git a/src/Scanner/Token.php b/src/Scanner/Token.php index a0b51fa..c62c758 100644 --- a/src/Scanner/Token.php +++ b/src/Scanner/Token.php @@ -13,15 +13,16 @@ namespace Phalcon\Volt\Scanner; +/** + * One scanned token: its opcode (a Phalcon\Volt\Compiler\Opcode value, or 0 + * for end of input) and, for identifiers, literals, raw text and the + * `default` keyword, its source text. + */ final class Token { - public readonly int $length; - public function __construct( public readonly int $opcode = 0, public readonly ?string $value = null, - int $length = 0, ) { - $this->length = ($length === 0 && $value !== null) ? mb_strlen($value) : $length; } } diff --git a/src/Tokens.php b/src/Tokens.php index e4241b5..66ead90 100644 --- a/src/Tokens.php +++ b/src/Tokens.php @@ -13,90 +13,103 @@ namespace Phalcon\Volt; -class Tokens +use Phalcon\Volt\Compiler\Opcode; + +/** + * Token names as they appear in "Syntax error, unexpected token ..." messages. + * + * A port of cphalcon's `phvolt_tokens` table (ext/phalcon/mvc/view/engine/ + * volt/base.c), looked up first match wins, which is why NOT prints as `!` + * and MOD as `%%`. Tokens missing from that table - `|`, `null`, `true`, + * `false`, raw text, `verbatim`, `endverbatim`, `endcall` - print as UNKNOWN, + * exactly as they do in cphalcon. + */ +final class Tokens { - public static array $names = [ - 'INTEGER' => Compiler::PHVOLT_T_INTEGER, - 'DOUBLE' => Compiler::PHVOLT_T_DOUBLE, - 'STRING' => Compiler::PHVOLT_T_STRING, - 'IDENTIFIER' => Compiler::PHVOLT_T_IDENTIFIER, - 'MINUS' => Compiler::PHVOLT_T_MINUS, - '+' => Compiler::PHVOLT_T_ADD, - '-' => Compiler::PHVOLT_T_SUB, - '*' => Compiler::PHVOLT_T_MUL, - '/' => Compiler::PHVOLT_T_DIV, - '%%' => Compiler::PHVOLT_T_MOD, - '!' => Compiler::PHVOLT_T_NOT, - '~' => Compiler::PHVOLT_T_CONCAT, - 'AND' => Compiler::PHVOLT_T_AND, - 'OR' => Compiler::PHVOLT_T_OR, - 'DOT' => Compiler::PHVOLT_T_DOT, - 'COMMA' => Compiler::PHVOLT_T_COMMA, - 'EQUALS' => Compiler::PHVOLT_T_EQUALS, - 'NOT EQUALS' => Compiler::PHVOLT_T_NOTEQUALS, - 'IDENTICAL' => Compiler::PHVOLT_T_IDENTICAL, - 'NOT IDENTICAL' => Compiler::PHVOLT_T_NOTIDENTICAL, - 'NOT' => Compiler::PHVOLT_T_NOT, - 'RANGE' => Compiler::PHVOLT_T_RANGE, - 'COLON' => Compiler::PHVOLT_T_COLON, - 'QUESTION MARK' => Compiler::PHVOLT_T_QUESTION, - '<' => Compiler::PHVOLT_T_LESS, - '<=' => Compiler::PHVOLT_T_LESSEQUAL, - '>' => Compiler::PHVOLT_T_GREATER, - '>=' => Compiler::PHVOLT_T_GREATEREQUAL, - '(' => Compiler::PHVOLT_T_PARENTHESES_OPEN, - ')' => Compiler::PHVOLT_T_PARENTHESES_CLOSE, - '[' => Compiler::PHVOLT_T_SBRACKET_OPEN, - ']' => Compiler::PHVOLT_T_SBRACKET_CLOSE, - '{' => Compiler::PHVOLT_T_CBRACKET_OPEN, - '}' => Compiler::PHVOLT_T_CBRACKET_CLOSE, - '{%' => Compiler::PHVOLT_T_OPEN_DELIMITER, - '%}' => Compiler::PHVOLT_T_CLOSE_DELIMITER, - '{{' => Compiler::PHVOLT_T_OPEN_EDELIMITER, - '}}' => Compiler::PHVOLT_T_CLOSE_EDELIMITER, - 'IF' => Compiler::PHVOLT_T_IF, - 'ELSE' => Compiler::PHVOLT_T_ELSE, - 'ELSEIF' => Compiler::PHVOLT_T_ELSEIF, - 'ELSEFOR' => Compiler::PHVOLT_T_ELSEFOR, - 'ENDIF' => Compiler::PHVOLT_T_ENDIF, - 'FOR' => Compiler::PHVOLT_T_FOR, - 'SWITCH' => Compiler::PHVOLT_T_SWITCH, - 'CASE' => Compiler::PHVOLT_T_CASE, - 'DEFAULT' => Compiler::PHVOLT_T_DEFAULT, - 'ENDSWITCH' => Compiler::PHVOLT_T_ENDSWITCH, - 'IN' => Compiler::PHVOLT_T_IN, - 'ENDFOR' => Compiler::PHVOLT_T_ENDFOR, - 'SET' => Compiler::PHVOLT_T_SET, - 'ASSIGN' => Compiler::PHVOLT_T_ASSIGN, - '+=' => Compiler::PHVOLT_T_ADD_ASSIGN, - '-=' => Compiler::PHVOLT_T_SUB_ASSIGN, - '*=' => Compiler::PHVOLT_T_MUL_ASSIGN, - '/=' => Compiler::PHVOLT_T_DIV_ASSIGN, - '++' => Compiler::PHVOLT_T_INCR, - '--' => Compiler::PHVOLT_T_DECR, - 'BLOCK' => Compiler::PHVOLT_T_BLOCK, - 'ENDBLOCK' => Compiler::PHVOLT_T_ENDBLOCK, - 'EXTENDS' => Compiler::PHVOLT_T_EXTENDS, - 'IS' => Compiler::PHVOLT_T_IS, - 'DEFINED' => Compiler::PHVOLT_T_DEFINED, - 'EMPTY' => Compiler::PHVOLT_T_EMPTY, - 'EVEN' => Compiler::PHVOLT_T_EVEN, - 'ODD' => Compiler::PHVOLT_T_ODD, - 'NUMERIC' => Compiler::PHVOLT_T_NUMERIC, - 'SCALAR' => Compiler::PHVOLT_T_SCALAR, - 'ITERABLE' => Compiler::PHVOLT_T_ITERABLE, - 'INCLUDE' => Compiler::PHVOLT_T_INCLUDE, - 'DO' => Compiler::PHVOLT_T_DO, - 'WHITESPACE' => Compiler::PHVOLT_T_IGNORE, - 'AUTOESCAPE' => Compiler::PHVOLT_T_AUTOESCAPE, - 'ENDAUTOESCAPE' => Compiler::PHVOLT_T_ENDAUTOESCAPE, - 'CONTINUE' => Compiler::PHVOLT_T_CONTINUE, - 'BREAK' => Compiler::PHVOLT_T_BREAK, - 'WITH' => Compiler::PHVOLT_T_WITH, - 'RETURN' => Compiler::PHVOLT_T_RETURN, - 'MACRO' => Compiler::PHVOLT_T_MACRO, - 'ENDMACRO' => Compiler::PHVOLT_T_ENDMACRO, - 'CALL' => Compiler::PHVOLT_T_CALL, - '' => 0, - ]; + public static function name(int $opcode): string + { + return match ($opcode) { + Opcode::INTEGER->value => 'INTEGER', + Opcode::DOUBLE->value => 'DOUBLE', + Opcode::STRING->value => 'STRING', + Opcode::IDENTIFIER->value => 'IDENTIFIER', + Opcode::MINUS->value => 'MINUS', + Opcode::ADD->value => '+', + Opcode::SUB->value => '-', + Opcode::MUL->value => '*', + Opcode::DIV->value => '/', + Opcode::MOD->value => '%%', + Opcode::NOT->value => '!', + Opcode::CONCAT->value => '~', + Opcode::AND->value => 'AND', + Opcode::OR->value => 'OR', + Opcode::DOT->value => 'DOT', + Opcode::COMMA->value => 'COMMA', + Opcode::EQUALS->value => 'EQUALS', + Opcode::NOTEQUALS->value => 'NOT EQUALS', + Opcode::IDENTICAL->value => 'IDENTICAL', + Opcode::NOTIDENTICAL->value => 'NOT IDENTICAL', + Opcode::RANGE->value => 'RANGE', + Opcode::COLON->value => 'COLON', + Opcode::QUESTION->value => 'QUESTION MARK', + Opcode::LESS->value => '<', + Opcode::LESSEQUAL->value => '<=', + Opcode::GREATER->value => '>', + Opcode::GREATEREQUAL->value => '>=', + Opcode::PARENTHESES_OPEN->value => '(', + Opcode::PARENTHESES_CLOSE->value => ')', + Opcode::SBRACKET_OPEN->value => '[', + Opcode::SBRACKET_CLOSE->value => ']', + Opcode::CBRACKET_OPEN->value => '{', + Opcode::CBRACKET_CLOSE->value => '}', + Opcode::OPEN_DELIMITER->value => '{%', + Opcode::CLOSE_DELIMITER->value => '%}', + Opcode::OPEN_EDELIMITER->value => '{{', + Opcode::CLOSE_EDELIMITER->value => '}}', + Opcode::IF->value => 'IF', + Opcode::ELSE->value => 'ELSE', + Opcode::ELSEIF->value => 'ELSEIF', + Opcode::ELSEFOR->value => 'ELSEFOR', + Opcode::ENDIF->value => 'ENDIF', + Opcode::FOR->value => 'FOR', + Opcode::SWITCH->value => 'SWITCH', + Opcode::CASE->value => 'CASE', + Opcode::DEFAULT->value => 'DEFAULT', + Opcode::ENDSWITCH->value => 'ENDSWITCH', + Opcode::IN->value => 'IN', + Opcode::ENDFOR->value => 'ENDFOR', + Opcode::SET->value => 'SET', + Opcode::ASSIGN->value => 'ASSIGN', + Opcode::ADD_ASSIGN->value => '+=', + Opcode::SUB_ASSIGN->value => '-=', + Opcode::MUL_ASSIGN->value => '*=', + Opcode::DIV_ASSIGN->value => '/=', + Opcode::INCR->value => '++', + Opcode::DECR->value => '--', + Opcode::BLOCK->value => 'BLOCK', + Opcode::ENDBLOCK->value => 'ENDBLOCK', + Opcode::EXTENDS->value => 'EXTENDS', + Opcode::IS->value => 'IS', + Opcode::DEFINED->value => 'DEFINED', + Opcode::EMPTY->value => 'EMPTY', + Opcode::EVEN->value => 'EVEN', + Opcode::ODD->value => 'ODD', + Opcode::NUMERIC->value => 'NUMERIC', + Opcode::SCALAR->value => 'SCALAR', + Opcode::ITERABLE->value => 'ITERABLE', + Opcode::INCLUDE->value => 'INCLUDE', + Opcode::DO->value => 'DO', + Opcode::IGNORE->value => 'WHITESPACE', + Opcode::AUTOESCAPE->value => 'AUTOESCAPE', + Opcode::ENDAUTOESCAPE->value => 'ENDAUTOESCAPE', + Opcode::CONTINUE->value => 'CONTINUE', + Opcode::BREAK->value => 'BREAK', + Opcode::WITH->value => 'WITH', + Opcode::RETURN->value => 'RETURN', + Opcode::MACRO->value => 'MACRO', + Opcode::ENDMACRO->value => 'ENDMACRO', + Opcode::CALL->value => 'CALL', + default => 'UNKNOWN', + }; + } } diff --git a/tests/differential.php b/tests/differential.php new file mode 100644 index 0000000..34973a6 --- /dev/null +++ b/tests/differential.php @@ -0,0 +1,117 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +/** + * Compares this package against the cphalcon C implementation, live, case by + * case over the whole parity corpus (`tests/fixtures/parity/*.php`). + * + * php -d extension=phalcon tests/differential.php [--verbose] + * + * Two comparisons are made per case: + * + * - parse: Phalcon\Volt\Parser\Parser::parse() vs the C Compiler::parse(). + * The AST (or the exception message) must be identical. Any + * mismatch outside `allow-list.php` fails the run (exit 1). + * - compile: Phalcon\Volt\Compiler::compileString() vs the C compileString(). + * Reported only: the compiler is not part of the parser migration, + * but a parser-caused difference shows up here first. + * + * Allow-listed cases (deliberate phalcon/volt divergences) are checked against + * their recorded expectation instead, so the allow-list cannot hide a + * regression. + * + * Requires ext-phalcon; exits 0 with a notice otherwise so it is harmless in a + * pipeline that does not always have the extension (CI asserts it is loaded). + */ + +require __DIR__ . '/../vendor/autoload.php'; + +use Phalcon\Mvc\View\Engine\Volt\Compiler as CCompiler; +use Phalcon\Tests\Support\Parity; +use Phalcon\Volt\Compiler as PhpCompiler; +use Phalcon\Volt\Parser\Parser as PhpParser; + +if (!extension_loaded('phalcon') || !class_exists(CCompiler::class)) { + fwrite(STDERR, "ext-phalcon is not loaded; nothing to compare against.\n"); + + exit(0); +} + +// Both compilers raise PHP notices on some inputs; they are not compared. +set_error_handler(static fn (): bool => true, E_NOTICE | E_WARNING | E_DEPRECATED); + +$verbose = in_array('--verbose', $argv, true); +$allowList = Parity::allowList(); + +$checked = 0; +$parseMismatches = 0; +$compileMismatches = 0; +$allowed = 0; + +$show = static function (string $kind, string $key, string $source, array $c, array $php): void { + echo "MISMATCH [{$kind}] {$key}\n"; + echo ' input : ' . json_encode($source, JSON_UNESCAPED_SLASHES) . "\n"; + echo ' C : ' . json_encode($c, JSON_UNESCAPED_SLASHES, Parity::JSON_DEPTH) . "\n"; + echo ' PHP : ' . json_encode($php, JSON_UNESCAPED_SLASHES, Parity::JSON_DEPTH) . "\n\n"; +}; + +foreach (Parity::corpus() as $group => $sources) { + foreach ($sources as $label => $source) { + $checked++; + $key = $group . '/' . $label; + + $cParse = Parity::comparable( + Parity::run(static fn (string $code): mixed => (new CCompiler())->parse($code), $source) + ); + $phpParse = Parity::comparable( + Parity::run(static fn (string $code): mixed => (new PhpParser())->parse($code), $source) + ); + + if (isset($allowList[$key])) { + $allowed++; + $expected = Parity::comparable($allowList[$key]); + if ($phpParse !== $expected) { + $parseMismatches++; + $show('allow-list', $key, $source, $expected, $phpParse); + } + + continue; + } + + if ($cParse !== $phpParse) { + $parseMismatches++; + $show('parse', $key, $source, $cParse, $phpParse); + } + + $cCompile = Parity::comparable( + Parity::run(static fn (string $code): mixed => (new CCompiler())->compileString($code), $source) + ); + $phpCompile = Parity::comparable( + Parity::run(static fn (string $code): mixed => (new PhpCompiler())->compileString($code), $source) + ); + + if ($cCompile !== $phpCompile) { + $compileMismatches++; + if ($verbose) { + $show('compile', $key, $source, $cCompile, $phpCompile); + } else { + echo "MISMATCH [compile] {$key}\n"; + } + } + } +} + +echo "Checked {$checked} case(s) ({$allowed} allow-listed): " + . "{$parseMismatches} parse mismatch(es), {$compileMismatches} compile mismatch(es) (reported only).\n"; + +exit($parseMismatches === 0 ? 0 : 1); diff --git a/tests/fixtures/parity/allow-list.php b/tests/fixtures/parity/allow-list.php new file mode 100644 index 0000000..cc9861f --- /dev/null +++ b/tests/fixtures/parity/allow-list.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +/** + * Deliberate phalcon/volt divergences from cphalcon, keyed by "group/label". + * + * Each entry is the outcome phalcon/volt must produce instead of the C golden. + * Keep this list short and give every entry a reason. + */ + +$removedCache = 'phalcon/volt removed the {% cache %} statement (commit 23585c1): ' + . '`cache` and `endcache` are plain identifiers'; + +$statement = [ + 'outcome' => 'throw', + 'value' => 'Syntax error, unexpected token IDENTIFIER(cache) in eval code on line 1', + 'reason' => $removedCache, +]; + +$identifier = static fn (string $name): array => [ + 'type' => 265, + 'value' => $name, + 'file' => 'eval code', + 'line' => 1, +]; + +$echo = static fn (array $expr): array => [ + 'outcome' => 'value', + 'value' => [['type' => 359, 'expr' => $expr, 'file' => 'eval code', 'line' => 1]], + 'reason' => $removedCache, +]; + +return [ + 'cache/cache: statement' => $statement, + 'cache/cache: statement lifetime' => $statement, + 'cache/cache: statement identifier' => $statement, + 'cache/cache: string key lifetime' => $statement, + 'cache/cache: identifier lifetime' => $statement, + 'cache/cache: string key' => $statement, + 'cache/cache: echo identifier' => $echo($identifier('cache')), + 'cache/cache: echo endcache' => $echo($identifier('endcache')), + 'cache/cache: property' => $echo([ + 'type' => 46, + 'left' => $identifier('a'), + 'right' => $identifier('cache'), + 'file' => 'eval code', + 'line' => 1, + ]), + 'cache/cache: function' => $echo([ + 'type' => 350, + 'name' => $identifier('cache'), + 'arguments' => [ + ['expr' => ['type' => 258, 'value' => '1', 'file' => 'eval code', 'line' => 1], 'file' => 'eval code', 'line' => 1], + ], + 'file' => 'eval code', + 'line' => 1, + ]), +]; diff --git a/tests/fixtures/parity/cache.json b/tests/fixtures/parity/cache.json new file mode 100644 index 0000000..a8a80e1 --- /dev/null +++ b/tests/fixtures/parity/cache.json @@ -0,0 +1,15 @@ +{ + "generator": "ext-phalcon 5.23.0", + "cases": { + "cache: statement": {"source":"{% cache sidebar %} hello {% endcache %}","parse":{"outcome":"value","value":[{"type":314,"expr":{"type":265,"value":"sidebar","file":"eval code","line":1},"block_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown statement 314 in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltStatement"}}, + "cache: statement lifetime": {"source":"{% cache sidebar 500 %} hello {% endcache %}","parse":{"outcome":"value","value":[{"type":314,"expr":{"type":265,"value":"sidebar","file":"eval code","line":1},"lifetime":{"type":258,"value":"500","file":"eval code","line":1},"block_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown statement 314 in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltStatement"}}, + "cache: statement identifier": {"source":"{% cache sidebar ttl %} hello {% endcache %}","parse":{"outcome":"value","value":[{"type":314,"expr":{"type":265,"value":"sidebar","file":"eval code","line":1},"lifetime":{"type":265,"value":"ttl","file":"eval code","line":1},"block_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown statement 314 in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltStatement"}}, + "cache: echo identifier": {"source":"{{ cache }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token CACHE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token CACHE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cache: echo endcache": {"source":"{{ endcache }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ENDCACHE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ENDCACHE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cache: property": {"source":"{{ a.cache }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token CACHE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token CACHE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cache: function": {"source":"{{ cache(1) }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token CACHE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token CACHE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cache: string key lifetime": {"source":"{% cache 'sidebar' 3600 %}{{ content }}{% endcache %}","parse":{"outcome":"value","value":[{"type":314,"expr":{"type":260,"value":"sidebar","file":"eval code","line":1},"lifetime":{"type":258,"value":"3600","file":"eval code","line":1},"block_statements":[{"type":359,"expr":{"type":265,"value":"content","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown statement 314 in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltStatement"}}, + "cache: identifier lifetime": {"source":"{% cache cacheKey lifetime %}{{ content }}{% endcache %}","parse":{"outcome":"value","value":[{"type":314,"expr":{"type":265,"value":"cacheKey","file":"eval code","line":1},"lifetime":{"type":265,"value":"lifetime","file":"eval code","line":1},"block_statements":[{"type":359,"expr":{"type":265,"value":"content","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown statement 314 in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltStatement"}}, + "cache: string key": {"source":"{% cache 'sidebar' %}{{ content }}{% endcache %}","parse":{"outcome":"value","value":[{"type":314,"expr":{"type":260,"value":"sidebar","file":"eval code","line":1},"block_statements":[{"type":359,"expr":{"type":265,"value":"content","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown statement 314 in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltStatement"}} + } +} diff --git a/tests/fixtures/parity/cache.php b/tests/fixtures/parity/cache.php new file mode 100644 index 0000000..7880737 --- /dev/null +++ b/tests/fixtures/parity/cache.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +/** + * Deliberate divergence: `{% cache %}` / `{% endcache %}` were removed from + * phalcon/volt (commit 23585c1), so `cache` and `endcache` are plain + * identifiers here while cphalcon treats them as keywords. + * + * The goldens still record what ext-phalcon does; the expected phalcon/volt + * outcome for each case lives in `allow-list.php`. + */ + +return [ + 'cache: statement' => '{% cache sidebar %} hello {% endcache %}', + 'cache: statement lifetime' => '{% cache sidebar 500 %} hello {% endcache %}', + 'cache: statement identifier' => '{% cache sidebar ttl %} hello {% endcache %}', + 'cache: echo identifier' => '{{ cache }}', + 'cache: echo endcache' => '{{ endcache }}', + 'cache: property' => '{{ a.cache }}', + 'cache: function' => '{{ cache(1) }}', + // cphalcon tests/unit/Mvc/View/Engine/Volt/Parser/CacheTest.php + 'cache: string key lifetime' => '{% cache \'sidebar\' 3600 %}{{ content }}{% endcache %}', + 'cache: identifier lifetime' => '{% cache cacheKey lifetime %}{{ content }}{% endcache %}', + 'cache: string key' => '{% cache \'sidebar\' %}{{ content }}{% endcache %}', +]; diff --git a/tests/fixtures/parity/depth.json b/tests/fixtures/parity/depth.json new file mode 100644 index 0000000..e0be9be --- /dev/null +++ b/tests/fixtures/parity/depth.json @@ -0,0 +1,116 @@ +{ + "generator": "ext-phalcon 5.23.0", + "cases": { + "parentheses x94": {"source":"{{ ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "parentheses x95": {"source":"{{ (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "parentheses x96": {"source":"{{ ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "parentheses x97": {"source":"{{ (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "parentheses x98": {"source":"{{ ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "parentheses x99": {"source":"{{ (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "parentheses after raw x93": {"source":"x{{ (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1},{"type":359,"expr":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "parentheses after raw x94": {"source":"x{{ ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1},{"type":359,"expr":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "parentheses after raw x95": {"source":"x{{ (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1},{"type":359,"expr":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":356,"left":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "parentheses after raw x96": {"source":"x{{ ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "parentheses after raw x97": {"source":"x{{ (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "parentheses after raw x98": {"source":"x{{ ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "arrays x94": {"source":"{{ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "arrays x95": {"source":"{{ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "arrays x96": {"source":"{{ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "arrays x97": {"source":"{{ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "arrays x98": {"source":"{{ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "arrays x99": {"source":"{{ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "calls x46": {"source":"{{ f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(1)))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [1])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])]) ?>"}}, + "calls x47": {"source":"{{ f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(1))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [1])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])]) ?>"}}, + "calls x48": {"source":"{{ f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(1)))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [$this->callMacro('f', [1])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])])]) ?>"}}, + "calls x49": {"source":"{{ f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(1))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "calls x50": {"source":"{{ f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(1)))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "calls x51": {"source":"{{ f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(1))))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "access x46": {"source":"{{ a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "access x47": {"source":"{{ a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "access x48": {"source":"{{ a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "access x49": {"source":"{{ a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "access x50": {"source":"{{ a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "access x51": {"source":"{{ a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unary minus x95": {"source":"{{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "unary minus x96": {"source":"{{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "unary minus x97": {"source":"{{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":368,"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "unary minus x98": {"source":"{{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unary minus x99": {"source":"{{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unary minus x100": {"source":"{{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unary not x95": {"source":"{{ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 1 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "unary not x96": {"source":"{{ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 1 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "unary not x97": {"source":"{{ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 1 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":33,"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "unary not x98": {"source":"{{ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 1 }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unary not x99": {"source":"{{ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 1 }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unary not x100": {"source":"{{ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 1 }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "not in x30": {"source":"{{ a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, $a)))))))))))))))))))))))))))))) ?>"}}, + "not in x31": {"source":"{{ a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, $a))))))))))))))))))))))))))))))) ?>"}}, + "not in x32": {"source":"{{ a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, !$this->isIncluded($a, $a)))))))))))))))))))))))))))))))) ?>"}}, + "not in x33": {"source":"{{ a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "not in x34": {"source":"{{ a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "not in x35": {"source":"{{ a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a not in a }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "ternary x45": {"source":"{{ a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? b : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "ternary x46": {"source":"{{ a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? b : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "ternary x47": {"source":"{{ a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? b : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "ternary x48": {"source":"{{ a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? b : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "ternary x49": {"source":"{{ a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? b : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "ternary x50": {"source":"{{ a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? b : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c : c }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "if x21": {"source":"{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "if x22": {"source":"{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "if x23": {"source":"{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "if x24": {"source":"{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "if x25": {"source":"{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "if x26": {"source":"{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "if empty innermost x22": {"source":"{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Phalcon\\Mvc\\View\\Engine\\Volt\\Compiler::statementList(): Argument #1 ($statements) must be of type array, null given","exception":"TypeError"}}, + "if empty innermost x23": {"source":"{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Phalcon\\Mvc\\View\\Engine\\Volt\\Compiler::statementList(): Argument #1 ($statements) must be of type array, null given","exception":"TypeError"}}, + "if empty innermost x24": {"source":"{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Phalcon\\Mvc\\View\\Engine\\Volt\\Compiler::statementList(): Argument #1 ($statements) must be of type array, null given","exception":"TypeError"}}, + "if empty innermost x25": {"source":"{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "if empty innermost x26": {"source":"{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "if empty innermost x27": {"source":"{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "if after raw x17": {"source":"x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"xxxxxxxxxxxxxxxxxx"}}, + "if after raw x18": {"source":"x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"xxxxxxxxxxxxxxxxxxx"}}, + "if after raw x19": {"source":"x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"xxxxxxxxxxxxxxxxxxxx"}}, + "if after raw x20": {"source":"x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "if after raw x21": {"source":"x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "if after raw x22": {"source":"x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% if a %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "if in else x9": {"source":"{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"xxxxxxxxxx"}}, + "if in else x10": {"source":"{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"xxxxxxxxxxx"}}, + "if in else x11": {"source":"{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"xxxxxxxxxxxx"}}, + "if in else x12": {"source":"{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "if in else x13": {"source":"{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "if in else x14": {"source":"{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}{% if a %}x{% else %}x{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "for x13": {"source":"{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}x{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "for x14": {"source":"{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}x{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "for x15": {"source":"{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}x{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "for x16": {"source":"{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}x{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "for x17": {"source":"{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}x{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "for x18": {"source":"{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}{% for x in y %}x{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "for key value x9": {"source":"{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}x{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?>x"}}, + "for key value x10": {"source":"{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}x{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?>x"}}, + "for key value x11": {"source":"{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}x{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?> $v) { ?>x"}}, + "for key value x12": {"source":"{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}x{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "for key value x13": {"source":"{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}x{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "for key value x14": {"source":"{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}{% for k, v in y %}x{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}{% endfor %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "autoescape x21": {"source":"{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}x{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}","parse":{"outcome":"value","value":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "autoescape x22": {"source":"{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}x{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}","parse":{"outcome":"value","value":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "autoescape x23": {"source":"{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}x{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}","parse":{"outcome":"value","value":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":317,"enable":1,"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "autoescape x24": {"source":"{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}x{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "autoescape x25": {"source":"{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}x{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "autoescape x26": {"source":"{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}{% autoescape true %}x{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}{% endautoescape %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "call x11": {"source":"{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}x{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}","parse":{"outcome":"value","value":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "call x12": {"source":"{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}x{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}","parse":{"outcome":"value","value":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "call x13": {"source":"{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}x{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}","parse":{"outcome":"value","value":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "call x14": {"source":"{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}x{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "call x15": {"source":"{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}x{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "call x16": {"source":"{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}{% call f(1) %}x{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}{% endcall %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "set access x45": {"source":"{% set a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "set access x46": {"source":"{% set a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "set access x47": {"source":"{% set a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "set access x48": {"source":"{% set a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] = 1 %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "set access x49": {"source":"{% set a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] = 1 %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "set access x50": {"source":"{% set a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] = 1 %}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "ordering: bracket instead of paren at 97": {"source":"{{ (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1])))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ] in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ] in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "ordering: case inside 23 ifs": {"source":"{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% if a %}{% case x %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}","parse":{"outcome":"throw","value":"Unexpected CASE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Unexpected CASE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon: 300 parentheses": {"source":"{{ ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) }}","parse":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Parsing failed, the template expression is nested too deeply","exception":"Phalcon\\Mvc\\View\\Exception"}} + } +} diff --git a/tests/fixtures/parity/depth.php b/tests/fixtures/parity/depth.php new file mode 100644 index 0000000..ad699fd --- /dev/null +++ b/tests/fixtures/parity/depth.php @@ -0,0 +1,143 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +/** + * Parser stack depth. cphalcon's Lemon parser has a fixed 100-entry stack + * (VVSTACKDEPTH, parser.c:82) and fails closed with "Parsing failed, the + * template expression is nested too deeply" when a shift would overflow it. + * + * Each construct is probed around its predicted boundary (last accepted N and + * first failing N, derived from the Lemon tables) with a margin of two on each + * side, so the goldens pin the exact cut-off even if a prediction is off by one. + */ + +/** + * @param callable(int): string $build + * + * @return array + */ +$probe = static function (string $name, int $lastAccepted, callable $build): array { + $cases = []; + + for ($n = $lastAccepted - 2; $n <= $lastAccepted + 3; $n++) { + $cases[sprintf('%s x%d', $name, $n)] = $build($n); + } + + return $cases; +}; + +$cases = array_merge( + $probe( + 'parentheses', + 96, + static fn (int $n): string => '{{ ' . str_repeat('(', $n) . '1' . str_repeat(')', $n) . ' }}' + ), + $probe( + 'parentheses after raw', + 95, + static fn (int $n): string => 'x{{ ' . str_repeat('(', $n) . '1' . str_repeat(')', $n) . ' }}' + ), + $probe( + 'arrays', + 96, + static fn (int $n): string => '{{ ' . str_repeat('[', $n) . '1' . str_repeat(']', $n) . ' }}' + ), + $probe( + 'calls', + 48, + static fn (int $n): string => '{{ ' . str_repeat('f(', $n) . '1' . str_repeat(')', $n) . ' }}' + ), + $probe( + 'access', + 48, + static fn (int $n): string => '{{ ' . str_repeat('a[', $n) . '1' . str_repeat(']', $n) . ' }}' + ), + $probe( + 'unary minus', + 97, + static fn (int $n): string => '{{ ' . str_repeat('- ', $n) . '1 }}' + ), + $probe( + 'unary not', + 97, + static fn (int $n): string => '{{ ' . str_repeat('! ', $n) . '1 }}' + ), + $probe( + 'not in', + 32, + static fn (int $n): string => '{{ a' . str_repeat(' not in a', $n) . ' }}' + ), + $probe( + 'ternary', + 47, + static fn (int $n): string => '{{ ' . str_repeat('a ? ', $n) . 'b' . str_repeat(' : c', $n) . ' }}' + ), + $probe( + 'if', + 23, + static fn (int $n): string => str_repeat('{% if a %}', $n) . 'x' . str_repeat('{% endif %}', $n) + ), + $probe( + 'if empty innermost', + 24, + static fn (int $n): string => str_repeat('{% if a %}', $n) . str_repeat('{% endif %}', $n) + ), + $probe( + 'if after raw', + 19, + static fn (int $n): string => str_repeat('x{% if a %}', $n) . 'x' . str_repeat('{% endif %}', $n) + ), + $probe( + 'if in else', + 11, + static fn (int $n): string => str_repeat('{% if a %}x{% else %}', $n) . 'x' . str_repeat('{% endif %}', $n) + ), + $probe( + 'for', + 15, + static fn (int $n): string => str_repeat('{% for x in y %}', $n) . 'x' . str_repeat('{% endfor %}', $n) + ), + $probe( + 'for key value', + 11, + static fn (int $n): string => str_repeat('{% for k, v in y %}', $n) . 'x' . str_repeat('{% endfor %}', $n) + ), + $probe( + 'autoescape', + 23, + static fn (int $n): string => str_repeat('{% autoescape true %}', $n) + . 'x' + . str_repeat('{% endautoescape %}', $n) + ), + $probe( + 'call', + 13, + static fn (int $n): string => str_repeat('{% call f(1) %}', $n) . 'x' . str_repeat('{% endcall %}', $n) + ), + $probe( + 'set access', + 47, + static fn (int $n): string => '{% set ' . str_repeat('a[', $n) . '1' . str_repeat(']', $n) . ' = 1 %}' + ), +); + +// A syntax error on the overflowing token wins over the overflow itself. +$cases['ordering: bracket instead of paren at 97'] = '{{ ' . str_repeat('(', 97) . '1]' . str_repeat(')', 96) . ' }}'; + +// A driver check on a token is raised before that token reaches the parser. +$cases['ordering: case inside 23 ifs'] = str_repeat('{% if a %}', 23) . '{% case x %}' . str_repeat('{% endif %}', 23); + +// cphalcon tests/unit/Mvc/View/Engine/Volt/Parser/StackOverflowTest.php +$cases['cphalcon: 300 parentheses'] = '{{ ' . str_repeat('(', 300) . '1' . str_repeat(')', 300) . ' }}'; + +return $cases; diff --git a/tests/fixtures/parity/errors.json b/tests/fixtures/parity/errors.json new file mode 100644 index 0000000..10ce835 --- /dev/null +++ b/tests/fixtures/parity/errors.json @@ -0,0 +1,153 @@ +{ + "generator": "ext-phalcon 5.23.0", + "cases": { + "syntax: identifier value": {"source":"{{ a b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(b) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(b) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "syntax: string value": {"source":"{{ a \"s\" }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token STRING(s) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token STRING(s) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "syntax: empty string value": {"source":"{{ a \"\" }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token STRING() in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token STRING() in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "syntax: zero string value": {"source":"{{ a \"0\" }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token STRING(0) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token STRING(0) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "syntax: whitespace string value": {"source":"{{ a \" \" }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token STRING( ) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token STRING( ) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "syntax: integer value": {"source":"{{ a 1 }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token INTEGER(1) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token INTEGER(1) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "syntax: double value": {"source":"{{ a 1.5 }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token DOUBLE(1.5) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token DOUBLE(1.5) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "syntax: concat after concat": {"source":"{{ robot.id ~ ~ robot.name }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ~ in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ~ in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "syntax: concat after concat nl": {"source":"{{ robot.id ~ ~ robot.name }}\n","parse":{"outcome":"throw","value":"Syntax error, unexpected token ~ in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ~ in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: null": {"source":"{{ a null }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: true": {"source":"{{ a true }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: false": {"source":"{{ a false }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: pipe": {"source":"{{ a | | b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: bang": {"source":"{{ a ! b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(b) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(b) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: not": {"source":"{{ a not b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(b) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(b) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: mod": {"source":"{{ a % % b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token %% in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token %% in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: minus": {"source":"{{ a - - }} x","parse":{"outcome":"throw","value":"Syntax error, unexpected token }} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token }} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: not equals": {"source":"{{ a != != b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token NOT EQUALS in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token NOT EQUALS in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: diamond": {"source":"{{ a <> <> b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token NOT EQUALS in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token NOT EQUALS in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: is not": {"source":"{{ a is not is not b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token NOT EQUALS in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token NOT EQUALS in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: question": {"source":"{{ a ? ? b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token QUESTION MARK in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token QUESTION MARK in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: colon": {"source":"{{ a : b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token COLON in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token COLON in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: range": {"source":"{{ a .. .. b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token RANGE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token RANGE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: dot": {"source":"{{ a . . b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token DOT in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token DOT in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: comma": {"source":"{{ a , b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token COMMA in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token COMMA in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: assign": {"source":"{{ a = b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ASSIGN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ASSIGN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: add assign": {"source":"{{ a += b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token += in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token += in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: incr prefix": {"source":"{{ ++a }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ++ in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ++ in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: in": {"source":"{{ in }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: is": {"source":"{{ is }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IS in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IS in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: defined": {"source":"{{ defined }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token DEFINED in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token DEFINED in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: empty keyword": {"source":"{{ empty }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token EMPTY in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token EMPTY in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: set keyword": {"source":"{{ set }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token SET in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token SET in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: open edelimiter": {"source":"{{ {{ a }} }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token {{ in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token {{ in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: close delimiter": {"source":"{{ a %} x","parse":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: raw fragment": {"source":"{% if a x %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(x) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(x) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: verbatim": {"source":"{{ a }}{% if verbatim %}x{% endif %} y","parse":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: endcall": {"source":"{% if a %}{% endcall %}{% endif %} y","parse":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: default outside switch": {"source":"{% default %} x","parse":{"outcome":"throw","value":"Syntax error, unexpected token DEFAULT(default) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token DEFAULT(default) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: default after expression": {"source":"{% switch a %}{% case 1 %}{{ default default }}{% endswitch %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token DEFAULT(default) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token DEFAULT(default) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: raw keyword removed": {"source":"{% raw %}x{% endraw %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(raw) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(raw) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: with": {"source":"{{ with }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token WITH in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token WITH in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "name: brackets": {"source":"{{ ] }} x","parse":{"outcome":"throw","value":"Syntax error, unexpected token ] in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ] in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "eof: dangling operator": {"source":"{{ 1 + }}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "eof: dangling operator newline": {"source":"{{ 1 + }}\n","parse":{"outcome":"throw","value":"Syntax error, unexpected token }} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token }} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "eof: open echo": {"source":"{{","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "eof: open statement": {"source":"{%","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "eof: open echo and expr": {"source":"{{ a","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "eof: empty echo": {"source":"{{ }}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "eof: empty echo then raw": {"source":"{{ }} x","parse":{"outcome":"throw","value":"Syntax error, unexpected token }} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token }} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "eof: close only": {"source":"}}","parse":{"outcome":"value","value":[{"type":357,"value":"}}","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"}}"}}, + "eof: close statement only": {"source":"%}","parse":{"outcome":"value","value":[{"type":357,"value":"%}","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"%}"}}, + "eof: extra close": {"source":"{{ a }}}}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"}}","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"}}"}}, + "unclosed: if": {"source":"{% if a %}x","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'if' block without close","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'if' block without close","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unclosed: if if": {"source":"{% if a %}x{% if b %}y","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there are 2 'if' blocks without close","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there are 2 'if' blocks without close","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unclosed: if if if": {"source":"{% if a %}{% if b %}{% if c %}z","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there are 3 'if' blocks without close","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there are 3 'if' blocks without close","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unclosed: for": {"source":"{% for a in b %}x","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'for' block without close","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'for' block without close","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unclosed: for for": {"source":"{% for a in b %}x{% for c in d %}y","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there are 0 'for' blocks without close","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there are 0 'for' blocks without close","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unclosed: if for": {"source":"{% if a %}x{% for b in c %}y","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'if' block without close, there is one 'for' block without close","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'if' block without close, there is one 'for' block without close","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unclosed: for if": {"source":"{% for a in b %}x{% if c %}y","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'if' block without close, there is one 'for' block without close","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'if' block without close, there is one 'for' block without close","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unclosed: switch": {"source":"{% switch a %}x","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is a 'switch' block without 'endswitch'","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is a 'switch' block without 'endswitch'","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unclosed: switch case": {"source":"{% switch a %}{% case 1 %}x","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is a 'switch' block without 'endswitch'","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is a 'switch' block without 'endswitch'","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unclosed: if for switch": {"source":"{% if a %}{% for b in c %}{% switch d %}x","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'if' block without close, there is one 'for' block without close, there is a 'switch' block without 'endswitch'","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'if' block without close, there is one 'for' block without close, there is a 'switch' block without 'endswitch'","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unclosed: if with else": {"source":"{% if a %}x{% else %}y","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'if' block without close","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'if' block without close","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unclosed: block": {"source":"{% block a %}x","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "unclosed: macro": {"source":"{% macro a() %}x","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: endif without if": {"source":"{% endif %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ENDIF in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ENDIF in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: endfor without for": {"source":"{% endfor %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ENDFOR in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ENDFOR in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: endblock without block": {"source":"{% endblock %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ENDBLOCK in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ENDBLOCK in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: else without if": {"source":"{% else %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ELSE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ELSE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: elseif without if": {"source":"{% elseif a %}","parse":{"outcome":"throw","value":"Unexpected ENDIF in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Unexpected ENDIF in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: case without switch": {"source":"{% case 1 %}","parse":{"outcome":"throw","value":"Unexpected CASE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Unexpected CASE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: endswitch without switch": {"source":"{% endswitch %}","parse":{"outcome":"throw","value":"Unexpected ENDSWITCH in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Unexpected ENDSWITCH in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: nested switch": {"source":"{% switch a %}{% switch b %}{% endswitch %}{% endswitch %}","parse":{"outcome":"throw","value":"A nested switch detected. There is no nested switch-case statements support in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"A nested switch detected. There is no nested switch-case statements support in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: nested block": {"source":"{% block a %}{% block b %}{% endblock %}{% endblock %}","parse":{"outcome":"throw","value":"Embedding blocks into other blocks is not supported in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Embedding blocks into other blocks is not supported in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: block in if": {"source":"{% if a %}{% block b %}x{% endblock %}{% endif %}","parse":{"outcome":"throw","value":"Embedding blocks into other blocks is not supported in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Embedding blocks into other blocks is not supported in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: block in for": {"source":"{% for a in b %}{% block c %}x{% endblock %}{% endfor %}","parse":{"outcome":"throw","value":"Embedding blocks into other blocks is not supported in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Embedding blocks into other blocks is not supported in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: nested macro": {"source":"{% macro a() %}{% macro b() %}x{% endmacro %}x{% endmacro %}","parse":{"outcome":"throw","value":"Embedding macros into other macros is not allowed in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Embedding macros into other macros is not allowed in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: extends twice": {"source":"{% extends \"a\" %}{% extends \"b\" %}","parse":{"outcome":"throw","value":"Extends statement must be placed at the first line in the template in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Extends statement must be placed at the first line in the template in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: extends after raw": {"source":"x{% extends \"a\" %}","parse":{"outcome":"throw","value":"Extends statement must be placed at the first line in the template in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Extends statement must be placed at the first line in the template in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: extends after echo": {"source":"{{ a }}{% extends \"a\" %}","parse":{"outcome":"throw","value":"Extends statement must be placed at the first line in the template in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Extends statement must be placed at the first line in the template in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: extends after blank": {"source":" \n{% extends \"a\" %}","parse":{"outcome":"value","value":[{"type":357,"value":" \n","file":"eval code","line":2},{"type":310,"path":{"type":260,"value":"a","file":"eval code","line":2},"file":"eval code","line":2}]},"compile":{"outcome":"throw","value":"Template file a does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "driver: child if": {"source":"{% extends \"a\" %}{% if a %}x{% endif %}","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: child for": {"source":"{% extends \"a\" %}{% for a in b %}x{% endfor %}","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: child switch": {"source":"{% extends \"a\" %}{% switch a %}{% endswitch %}","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: child set": {"source":"{% extends \"a\" %}{% set a = 1 %}","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: child echo": {"source":"{% extends \"a\" %}{{ a }}","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: child raw": {"source":"{% extends \"a\" %}x","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: child blank raw": {"source":"{% extends \"a\" %}\n \n{% block a %}x{% endblock %}\n","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"a","file":"eval code","line":1},"file":"eval code","line":3},{"type":307,"name":"a","block_statements":[{"type":357,"value":"x","file":"eval code","line":3}],"file":"eval code","line":4}]},"compile":{"outcome":"throw","value":"Template file a does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "driver: child block raw": {"source":"{% extends \"a\" %}{% block a %}x{% endblock %}","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},{"type":307,"name":"a","block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file a does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "driver: child do": {"source":"{% extends \"a\" %}{% do a %}","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},{"type":316,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file a does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "driver: child macro": {"source":"{% extends \"a\" %}{% macro m() %}x{% endmacro %}","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: child include": {"source":"{% extends \"a\" %}{% include \"b\" %}","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},{"type":313,"path":{"type":260,"value":"b","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file a does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "driver: for if then block": {"source":"{% for a in b if c %}x{% endfor %}{% block d %}{% endblock %}","parse":{"outcome":"throw","value":"Embedding blocks into other blocks is not supported in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Embedding blocks into other blocks is not supported in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: for if then two blocks": {"source":"{% for a in b if c %}x{% endfor %}{% for e in f %}y{% endfor %}{% block d %}z{% endblock %}","parse":{"outcome":"throw","value":"Embedding blocks into other blocks is not supported in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Embedding blocks into other blocks is not supported in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: for without if then block": {"source":"{% for a in b %}x{% endfor %}{% block d %}{% endblock %}","parse":{"outcome":"value","value":[{"type":304,"variable":"a","expr":{"type":265,"value":"b","file":"eval code","line":1},"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1},{"type":307,"name":"d","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "driver: for if inside child block": {"source":"{% extends \"a\" %}{% block b %}{% for c in d if e %}x{% endfor %}{% endblock %}{% block f %}{% endblock %}","parse":{"outcome":"throw","value":"Embedding blocks into other blocks is not supported in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Embedding blocks into other blocks is not supported in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "driver: for if then echo in child": {"source":"{% extends \"a\" %}{% block b %}{% for c in d if e %}x{% endfor %}{% endblock %}{{ g }}","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},{"type":307,"name":"b","block_statements":[{"type":304,"variable":"c","expr":{"type":265,"value":"d","file":"eval code","line":1},"if_expr":{"type":265,"value":"e","file":"eval code","line":1},"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"g","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file a does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "statement: set empty": {"source":"{% set %}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: set no value": {"source":"{% set a %}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: set dangling assign": {"source":"{% set a = %}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: set integer target": {"source":"{% set 1 = 1 %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token INTEGER(1) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token INTEGER(1) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: set call target": {"source":"{% set a() = 1 %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ( in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ( in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: for empty": {"source":"{% for %}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'for' block without close","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'for' block without close","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: for no in": {"source":"{% for a %}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'for' block without close","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'for' block without close","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: for no iterable": {"source":"{% for a in %}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'for' block without close","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'for' block without close","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: for missing value": {"source":"{% for a, in b %}x{% endfor %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: macro empty": {"source":"{% macro %}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: macro no parens": {"source":"{% macro a %}x{% endmacro %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: macro open paren": {"source":"{% macro a( %}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: macro default ident": {"source":"{% macro a(b = c) %}x{% endmacro %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(c) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(c) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: macro default negative": {"source":"{% macro a(b = -1) %}x{% endmacro %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token - in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token - in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: autoescape ident": {"source":"{% autoescape a %}x{% endautoescape %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(a) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(a) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: autoescape empty": {"source":"{% autoescape %}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: include empty": {"source":"{% include %}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: include with nothing": {"source":"{% include a with %}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: call empty": {"source":"{% call %}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: call no parens": {"source":"{% call a %}x{% endcall %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: verbatim unclosed": {"source":"{% verbatim %}x","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: verbatim bare": {"source":"{% verbatim %}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: endverbatim alone": {"source":"{% endverbatim %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: block no name": {"source":"{% block %}x{% endblock %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: unknown keyword": {"source":"{% foo %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(foo) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(foo) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: echo in statement": {"source":"{% a %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(a) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(a) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: ternary missing else": {"source":"{{ a ? b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: trailing dot": {"source":"{{ a.b.c. }}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "statement: break with expr": {"source":"{% break a %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(a) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(a) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "scan: dollar short": {"source":"{{ $ }}","parse":{"outcome":"throw","value":"Scanning error before ' }}' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before ' }}' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "scan: dollar long": {"source":"{{ a $ bcdefghijklmnopqrstuvwxyz }}","parse":{"outcome":"throw","value":"Scanning error before ' bcdefghijklmnop...' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before ' bcdefghijklmnop...' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "scan: at sign": {"source":"{{ a @ b }}","parse":{"outcome":"throw","value":"Scanning error before ' b }}' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before ' b }}' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "scan: caret": {"source":"{{ a ^ b }}","parse":{"outcome":"throw","value":"Scanning error before ' b }}' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before ' b }}' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "scan: ampersand": {"source":"{{ a & b }}","parse":{"outcome":"throw","value":"Scanning error before ' b }}' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before ' b }}' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "scan: semicolon": {"source":"{{ a; }}","parse":{"outcome":"throw","value":"Scanning error before ' }}' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before ' }}' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "scan: trailing backslash dq": {"source":"{{ \"abc\\","parse":{"outcome":"throw","value":"Scanning error before 'abc\\' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before 'abc\\' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "scan: trailing backslash sq": {"source":"{{ 'abc\\","parse":{"outcome":"throw","value":"Scanning error before 'abc\\' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before 'abc\\' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "scan: unterminated dq": {"source":"{{ \"abc","parse":{"outcome":"throw","value":"Scanning error before 'abc' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before 'abc' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "scan: unterminated sq": {"source":"{{ 'abc","parse":{"outcome":"throw","value":"Scanning error before 'abc' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before 'abc' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "scan: unterminated long": {"source":"{{ \"abcdefghijklmnopqrstuvwxyz","parse":{"outcome":"throw","value":"Scanning error before 'abcdefghijklmnop...' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before 'abcdefghijklmnop...' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "scan: error on second line": {"source":"{{ a }}\n{{ $ }}","parse":{"outcome":"throw","value":"Scanning error before ' }}' in eval code on line 2","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before ' }}' in eval code on line 2","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "scan: error after ignore": {"source":"{{ a $ }}","parse":{"outcome":"throw","value":"Scanning error before ' }}' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before ' }}' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "dangling: trimmed fragment": {"source":"{{ a -}}\n\n\n{{ }}b","parse":{"outcome":"throw","value":"Syntax error, unexpected token }}() in eval code on line 4","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token }}() in eval code on line 4","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "dangling: trimmed before open": {"source":" {{-{{- with -}} ","parse":{"outcome":"throw","value":"Syntax error, unexpected token {{() in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token {{() in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "dangling: comment then trimmed": {"source":"{# c #} {{-{{- a }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token {{() in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token {{() in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "dangling: value token resets": {"source":"{{ a -}}\n{{ b ] }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ] in eval code on line 2","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ] in eval code on line 2","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "dangling: trimmed then keyword": {"source":"{%- if a -%} {%-] endif -%}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ]() in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ]() in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "comment: unterminated after if": {"source":"{% if a %}{# x","parse":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "comment: closed after if": {"source":"{% if a %}{# x #}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'if' block without close","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'if' block without close","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "comment: closed after if newline": {"source":"{% if a %}{# x #}\n","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'if' block without close","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is one 'if' block without close","exception":"Phalcon\\Mvc\\View\\Exception"}} + } +} diff --git a/tests/fixtures/parity/errors.php b/tests/fixtures/parity/errors.php new file mode 100644 index 0000000..a824e91 --- /dev/null +++ b/tests/fixtures/parity/errors.php @@ -0,0 +1,191 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +/** + * Every error-message family produced by base.c and the Lemon + * `%syntax_error` block: token-name quirks (`!`, `%%`, `NOT EQUALS`, + * `QUESTION MARK`, `UNKNOWN`, `WHITESPACE`), the token value suffix, the + * "unexpected EOF" path with its unclosed-block suffixes, driver checks + * (extends / child templates / nesting) and scanning errors. + */ + +return [ + // Token value suffix + 'syntax: identifier value' => '{{ a b }}', + 'syntax: string value' => '{{ a "s" }}', + 'syntax: empty string value' => '{{ a "" }}', + 'syntax: zero string value' => '{{ a "0" }}', + 'syntax: whitespace string value' => '{{ a " " }}', + 'syntax: integer value' => '{{ a 1 }}', + 'syntax: double value' => '{{ a 1.5 }}', + 'syntax: concat after concat' => '{{ robot.id ~ ~ robot.name }}', + 'syntax: concat after concat nl' => "{{ robot.id ~ ~ robot.name }}\n", + + // Token names + 'name: null' => '{{ a null }}', + 'name: true' => '{{ a true }}', + 'name: false' => '{{ a false }}', + 'name: pipe' => '{{ a | | b }}', + 'name: bang' => '{{ a ! b }}', + 'name: not' => '{{ a not b }}', + 'name: mod' => '{{ a % % b }}', + 'name: minus' => '{{ a - - }} x', + 'name: not equals' => '{{ a != != b }}', + 'name: diamond' => '{{ a <> <> b }}', + 'name: is not' => '{{ a is not is not b }}', + 'name: question' => '{{ a ? ? b }}', + 'name: colon' => '{{ a : b }}', + 'name: range' => '{{ a .. .. b }}', + 'name: dot' => '{{ a . . b }}', + 'name: comma' => '{{ a , b }}', + 'name: assign' => '{{ a = b }}', + 'name: add assign' => '{{ a += b }}', + 'name: incr prefix' => '{{ ++a }}', + 'name: in' => '{{ in }}', + 'name: is' => '{{ is }}', + 'name: defined' => '{{ defined }}', + 'name: empty keyword' => '{{ empty }}', + 'name: set keyword' => '{{ set }}', + 'name: open edelimiter' => '{{ {{ a }} }}', + 'name: close delimiter' => '{{ a %} x', + 'name: raw fragment' => '{% if a x %}', + 'name: verbatim' => '{{ a }}{% if verbatim %}x{% endif %} y', + 'name: endcall' => '{% if a %}{% endcall %}{% endif %} y', + 'name: default outside switch' => '{% default %} x', + 'name: default after expression' => '{% switch a %}{% case 1 %}{{ default default }}{% endswitch %}', + 'name: raw keyword removed' => '{% raw %}x{% endraw %}', + 'name: with' => '{{ with }}', + 'name: brackets' => '{{ ] }} x', + + // Error on the final byte reads as EOF + 'eof: dangling operator' => '{{ 1 + }}', + 'eof: dangling operator newline' => "{{ 1 + }}\n", + 'eof: open echo' => '{{', + 'eof: open statement' => '{%', + 'eof: open echo and expr' => '{{ a', + 'eof: empty echo' => '{{ }}', + 'eof: empty echo then raw' => '{{ }} x', + 'eof: close only' => '}}', + 'eof: close statement only' => '%}', + 'eof: extra close' => '{{ a }}}}', + + // Unclosed blocks + 'unclosed: if' => '{% if a %}x', + 'unclosed: if if' => '{% if a %}x{% if b %}y', + 'unclosed: if if if' => '{% if a %}{% if b %}{% if c %}z', + 'unclosed: for' => '{% for a in b %}x', + 'unclosed: for for' => '{% for a in b %}x{% for c in d %}y', + 'unclosed: if for' => '{% if a %}x{% for b in c %}y', + 'unclosed: for if' => '{% for a in b %}x{% if c %}y', + 'unclosed: switch' => '{% switch a %}x', + 'unclosed: switch case' => '{% switch a %}{% case 1 %}x', + 'unclosed: if for switch' => '{% if a %}{% for b in c %}{% switch d %}x', + 'unclosed: if with else' => '{% if a %}x{% else %}y', + 'unclosed: block' => '{% block a %}x', + 'unclosed: macro' => '{% macro a() %}x', + + // Driver (base.c) checks + 'driver: endif without if' => '{% endif %}', + 'driver: endfor without for' => '{% endfor %}', + 'driver: endblock without block' => '{% endblock %}', + 'driver: else without if' => '{% else %}', + 'driver: elseif without if' => '{% elseif a %}', + 'driver: case without switch' => '{% case 1 %}', + 'driver: endswitch without switch' => '{% endswitch %}', + 'driver: nested switch' => '{% switch a %}{% switch b %}{% endswitch %}{% endswitch %}', + 'driver: nested block' => '{% block a %}{% block b %}{% endblock %}{% endblock %}', + 'driver: block in if' => '{% if a %}{% block b %}x{% endblock %}{% endif %}', + 'driver: block in for' => '{% for a in b %}{% block c %}x{% endblock %}{% endfor %}', + 'driver: nested macro' => '{% macro a() %}{% macro b() %}x{% endmacro %}x{% endmacro %}', + 'driver: extends twice' => '{% extends "a" %}{% extends "b" %}', + 'driver: extends after raw' => 'x{% extends "a" %}', + 'driver: extends after echo' => '{{ a }}{% extends "a" %}', + 'driver: extends after blank' => " \n{% extends \"a\" %}", + 'driver: child if' => '{% extends "a" %}{% if a %}x{% endif %}', + 'driver: child for' => '{% extends "a" %}{% for a in b %}x{% endfor %}', + 'driver: child switch' => '{% extends "a" %}{% switch a %}{% endswitch %}', + 'driver: child set' => '{% extends "a" %}{% set a = 1 %}', + 'driver: child echo' => '{% extends "a" %}{{ a }}', + 'driver: child raw' => '{% extends "a" %}x', + 'driver: child blank raw' => "{% extends \"a\" %}\n \n{% block a %}x{% endblock %}\n", + 'driver: child block raw' => '{% extends "a" %}{% block a %}x{% endblock %}', + 'driver: child do' => '{% extends "a" %}{% do a %}', + 'driver: child macro' => '{% extends "a" %}{% macro m() %}x{% endmacro %}', + 'driver: child include' => '{% extends "a" %}{% include "b" %}', + // `{% for ... if %}` counts as an opened if block and never closes it, so + // the block level stays raised after the loop (cphalcon base.c quirk) + 'driver: for if then block' => '{% for a in b if c %}x{% endfor %}{% block d %}{% endblock %}', + 'driver: for if then two blocks' => '{% for a in b if c %}x{% endfor %}{% for e in f %}y{% endfor %}{% block d %}z{% endblock %}', + 'driver: for without if then block' => '{% for a in b %}x{% endfor %}{% block d %}{% endblock %}', + 'driver: for if inside child block' => '{% extends "a" %}{% block b %}{% for c in d if e %}x{% endfor %}{% endblock %}{% block f %}{% endblock %}', + 'driver: for if then echo in child' => '{% extends "a" %}{% block b %}{% for c in d if e %}x{% endfor %}{% endblock %}{{ g }}', + + // Statement-level syntax errors + 'statement: set empty' => '{% set %}', + 'statement: set no value' => '{% set a %}', + 'statement: set dangling assign' => '{% set a = %}', + 'statement: set integer target' => '{% set 1 = 1 %}', + 'statement: set call target' => '{% set a() = 1 %}', + 'statement: for empty' => '{% for %}', + 'statement: for no in' => '{% for a %}', + 'statement: for no iterable' => '{% for a in %}', + 'statement: for missing value' => '{% for a, in b %}x{% endfor %}', + 'statement: macro empty' => '{% macro %}', + 'statement: macro no parens' => '{% macro a %}x{% endmacro %}', + 'statement: macro open paren' => '{% macro a( %}', + 'statement: macro default ident' => '{% macro a(b = c) %}x{% endmacro %}', + 'statement: macro default negative' => '{% macro a(b = -1) %}x{% endmacro %}', + 'statement: autoescape ident' => '{% autoescape a %}x{% endautoescape %}', + 'statement: autoescape empty' => '{% autoescape %}', + 'statement: include empty' => '{% include %}', + 'statement: include with nothing' => '{% include a with %}', + 'statement: call empty' => '{% call %}', + 'statement: call no parens' => '{% call a %}x{% endcall %}', + 'statement: verbatim unclosed' => '{% verbatim %}x', + 'statement: verbatim bare' => '{% verbatim %}', + 'statement: endverbatim alone' => '{% endverbatim %}', + 'statement: block no name' => '{% block %}x{% endblock %}', + 'statement: unknown keyword' => '{% foo %}', + 'statement: echo in statement' => '{% a %}', + 'statement: ternary missing else' => '{{ a ? b }}', + 'statement: trailing dot' => '{{ a.b.c. }}', + 'statement: break with expr' => '{% break a %}', + + // Scanning errors + 'scan: dollar short' => '{{ $ }}', + 'scan: dollar long' => '{{ a $ bcdefghijklmnopqrstuvwxyz }}', + 'scan: at sign' => '{{ a @ b }}', + 'scan: caret' => '{{ a ^ b }}', + 'scan: ampersand' => '{{ a & b }}', + 'scan: semicolon' => '{{ a; }}', + 'scan: trailing backslash dq' => '{{ "abc\\', + 'scan: trailing backslash sq' => "{{ 'abc\\", + 'scan: unterminated dq' => '{{ "abc', + 'scan: unterminated sq' => "{{ 'abc", + 'scan: unterminated long' => '{{ "abcdefghijklmnopqrstuvwxyz', + 'scan: error on second line' => "{{ a }}\n{{ $ }}", + 'scan: error after ignore' => '{{ a $ }}', + + // A raw fragment trimmed to nothing leaves an empty dangling value in + // cphalcon, so the next error without a value of its own prints "()" + 'dangling: trimmed fragment' => "{{ a -}}\n\n\n{{ }}b", + 'dangling: trimmed before open' => ' {{-{{- with -}} ', + 'dangling: comment then trimmed' => '{# c #} {{-{{- a }}', + 'dangling: value token resets' => "{{ a -}}\n{{ b ] }}", + 'dangling: trimmed then keyword' => '{%- if a -%} {%-] endif -%}', + + // Comments interacting with errors + 'comment: unterminated after if' => '{% if a %}{# x', + 'comment: closed after if' => '{% if a %}{# x #}', + 'comment: closed after if newline' => "{% if a %}{# x #}\n", +]; diff --git a/tests/fixtures/parity/grammar-shape.json b/tests/fixtures/parity/grammar-shape.json new file mode 100644 index 0000000..17f18ea --- /dev/null +++ b/tests/fixtures/parity/grammar-shape.json @@ -0,0 +1,81 @@ +{ + "generator": "ext-phalcon 5.23.0", + "cases": { + "if: empty": {"source":"{% if a %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Phalcon\\Mvc\\View\\Engine\\Volt\\Compiler::statementList(): Argument #1 ($statements) must be of type array, null given","exception":"TypeError"}}, + "if: empty both": {"source":"{% if a %}{% else %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Phalcon\\Mvc\\View\\Engine\\Volt\\Compiler::statementList(): Argument #1 ($statements) must be of type array, null given","exception":"TypeError"}}, + "if: empty true non-empty else": {"source":"{% if a %}{% else %}x{% endif %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN(x) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN(x) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "if: non-empty true empty else": {"source":"{% if a %}x{% else %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "if: elseif chain": {"source":"{% if a %}1{% elseif b %}2{% elseif c %}3{% else %}4{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"1","file":"eval code","line":1},{"type":302,"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"2","file":"eval code","line":1},{"type":302,"expr":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"3","file":"eval code","line":1}],"false_statements":[{"type":357,"value":"4","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"1234"}}, + "if: elseif empty": {"source":"{% if a %}{% elseif b %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":302,"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "for: empty": {"source":"{% for x in y %}{% endfor %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ENDFOR in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ENDFOR in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "for: else": {"source":"{% for v in y %}x{% else %}y{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"v","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":321,"file":"eval code","line":1},{"type":357,"value":"y","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"xy"}}, + "for: elsefor": {"source":"{% for v in y if v %}x{% elsefor %}y{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"v","expr":{"type":265,"value":"y","file":"eval code","line":1},"if_expr":{"type":265,"value":"v","file":"eval code","line":1},"block_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":321,"file":"eval code","line":1},{"type":357,"value":"y","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"xy"}}, + "for: key value if": {"source":"{% for k, v in y if k %}x{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"if_expr":{"type":265,"value":"k","file":"eval code","line":1},"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" $v) { if ($k) { ?>x"}}, + "for: if inside for else": {"source":"{% for a in b %}{% if c %}x{% else %}y{% endif %}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"a","expr":{"type":265,"value":"b","file":"eval code","line":1},"block_statements":[{"type":300,"expr":{"type":265,"value":"c","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"false_statements":[{"type":357,"value":"y","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"xy"}}, + "for: else in if inside for": {"source":"{% if a %}{% for b in c %}x{% else %}y{% endfor %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":304,"variable":"b","expr":{"type":265,"value":"c","file":"eval code","line":1},"block_statements":[{"type":357,"value":"x","file":"eval code","line":1},{"type":321,"file":"eval code","line":1},{"type":357,"value":"y","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"xy"}}, + "switch: empty": {"source":"{% switch a %}{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "switch: raw before case": {"source":"{% switch a %} x {% case 1 %}y{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"a","file":"eval code","line":1},"case_clauses":[{"type":357,"value":" x ","file":"eval code","line":1},{"type":412,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"y","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x y"}}, + "switch: cases": {"source":"{% switch a %}{% case 1 %}x{% case 2 %}{% default %}z{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"a","file":"eval code","line":1},"case_clauses":[{"type":412,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"x","file":"eval code","line":1},{"type":412,"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"type":413,"file":"eval code","line":1},{"type":357,"value":"z","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"xz"}}, + "block: empty": {"source":"{% block a %}{% endblock %}","parse":{"outcome":"value","value":[{"type":307,"name":"a","file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "block: body": {"source":"{% block a %}x{% endblock %}","parse":{"outcome":"value","value":[{"type":307,"name":"a","block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "macro: empty": {"source":"{% macro m() %}{% endmacro %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ENDMACRO in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ENDMACRO in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "macro: body": {"source":"{% macro m() %}x{% endmacro %}","parse":{"outcome":"value","value":[{"type":322,"name":"m","block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"macros['m'] = function() { ?>xmacros['m'] = \\Closure::bind($this->macros['m'], $this); ?>"}}, + "macro: defaults": {"source":"{% macro m(a = 1, b = \"x\", c = 1.5, d = null, e = true, f = false) %}x{% endmacro %}","parse":{"outcome":"value","value":[{"type":322,"name":"m","parameters":[{"variable":"a","default":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"variable":"b","default":{"type":260,"value":"x","file":"eval code","line":1},"file":"eval code","line":1},{"variable":"c","default":{"type":259,"value":"1.5","file":"eval code","line":1},"file":"eval code","line":1},{"variable":"d","default":{"type":261,"file":"eval code","line":1},"file":"eval code","line":1},{"variable":"e","default":{"type":263,"file":"eval code","line":1},"file":"eval code","line":1},{"variable":"f","default":{"type":262,"file":"eval code","line":1},"file":"eval code","line":1}],"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"macros['m'] = function($__p = null) { if (isset($__p[0])) { $a = $__p[0]; } else { if (array_key_exists(\"a\", $__p)) { $a = $__p[\"a\"]; } else { $a = 1; } } if (isset($__p[1])) { $b = $__p[1]; } else { if (array_key_exists(\"b\", $__p)) { $b = $__p[\"b\"]; } else { $b = 'x'; } } if (isset($__p[2])) { $c = $__p[2]; } else { if (array_key_exists(\"c\", $__p)) { $c = $__p[\"c\"]; } else { $c = 1.5; } } if (isset($__p[3])) { $d = $__p[3]; } else { if (array_key_exists(\"d\", $__p)) { $d = $__p[\"d\"]; } else { $d = null; } } if (isset($__p[4])) { $e = $__p[4]; } else { if (array_key_exists(\"e\", $__p)) { $e = $__p[\"e\"]; } else { $e = true; } } if (isset($__p[5])) { $f = $__p[5]; } else { if (array_key_exists(\"f\", $__p)) { $f = $__p[\"f\"]; } else { $f = false; } } ?>xmacros['m'] = \\Closure::bind($this->macros['m'], $this); ?>"}}, + "macro: mixed params": {"source":"{% macro m(a, b = 1, c) %}x{% endmacro %}","parse":{"outcome":"value","value":[{"type":322,"name":"m","parameters":[{"variable":"a","file":"eval code","line":1},{"variable":"b","default":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"variable":"c","file":"eval code","line":1}],"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"macros['m'] = function($__p = null) { if (isset($__p[0])) { $a = $__p[0]; } else { if (array_key_exists(\"a\", $__p)) { $a = $__p[\"a\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'm' was called without parameter: a\"); } } if (isset($__p[1])) { $b = $__p[1]; } else { if (array_key_exists(\"b\", $__p)) { $b = $__p[\"b\"]; } else { $b = 1; } } if (isset($__p[2])) { $c = $__p[2]; } else { if (array_key_exists(\"c\", $__p)) { $c = $__p[\"c\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'm' was called without parameter: c\"); } } ?>xmacros['m'] = \\Closure::bind($this->macros['m'], $this); ?>"}}, + "autoescape: empty": {"source":"{% autoescape true %}{% endautoescape %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ENDAUTOESCAPE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ENDAUTOESCAPE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "autoescape: false": {"source":"{% autoescape false %}x{% endautoescape %}","parse":{"outcome":"value","value":[{"type":317,"enable":0,"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "verbatim: empty": {"source":"{% verbatim %}{% endverbatim %}","parse":{"outcome":"value","value":[{"type":357,"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "call: no args empty": {"source":"{% call f() %}{% endcall %}","parse":{"outcome":"value","value":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "call: no args body": {"source":"{% call f() %}x{% endcall %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN(x) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN(x) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "call: args empty": {"source":"{% call f(1) %}{% endcall %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token UNKNOWN in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "call: args body": {"source":"{% call f(1) %}x{% endcall %}","parse":{"outcome":"value","value":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "call: named args": {"source":"{% call f(\"a\": 1, 2) %}x{% endcall %}","parse":{"outcome":"value","value":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"name":"a","file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "call: method": {"source":"{% call a.b(1) %}x{% endcall %}","parse":{"outcome":"value","value":[{"type":325,"name":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "call: chained": {"source":"{% call a(1)(2) %}x{% endcall %}","parse":{"outcome":"value","value":[{"type":325,"name":{"type":350,"name":{"type":265,"value":"a","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "call: enclosed target": {"source":"{% call (a)(1) %}x{% endcall %}","parse":{"outcome":"value","value":[{"type":325,"name":{"type":356,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "call: binary target": {"source":"{% call a + b(1) %}x{% endcall %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "call: is target": {"source":"{% call x is y() %}x{% endcall %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "call: filter target": {"source":"{% call a|b(1) %}x{% endcall %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "array: empty": {"source":"{{ [] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "array: hash empty": {"source":"{{ {} }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "array: trailing comma": {"source":"{{ [1,] }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ] in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ] in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "array: hash trailing comma": {"source":"{{ {\"a\": 1, } }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token } in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token } in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "array: identifier key": {"source":"{{ {a: 1} }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token COLON in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token COLON in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "array: named in brackets": {"source":"{{ [\"a\": 1] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"name":"a","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" 1] ?>"}}, + "array: mixed items": {"source":"{{ [1, \"a\": 2, 3] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"name":"a","file":"eval code","line":1},{"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" 2, 3] ?>"}}, + "array: integer key": {"source":"{{ {1: 2} }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token COLON in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token COLON in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "array: nested": {"source":"{{ [[1, 2], {\"a\": [3]}] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":360,"left":[{"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"name":"a","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" [3]]] ?>"}}, + "call: no args": {"source":"{{ f() }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('f', []) ?>"}}, + "call: named arg": {"source":"{{ f(\"a\": 1) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"name":"a","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('f', ['a' => 1]) ?>"}}, + "call: identifier named arg": {"source":"{{ f(a: 1) }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token COLON in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token COLON in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "call: trailing comma": {"source":"{{ f(1,) }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "slice: identifier offsets": {"source":"{{ a[b:c] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":365,"left":{"type":265,"value":"a","file":"eval code","line":1},"start":{"type":265,"value":"b","file":"eval code","line":1},"end":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"slice($a, $b, $c) ?>"}}, + "slice: dotted offset": {"source":"{{ a[b.c:d] }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token COLON in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token COLON in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "slice: expression offset": {"source":"{{ a[1 + 2:3] }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token COLON in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token COLON in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "slice: string offset": {"source":"{{ a[\"x\":1] }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token COLON in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token COLON in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "slice: spaced": {"source":"{{ a[1 : 2] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":365,"left":{"type":265,"value":"a","file":"eval code","line":1},"start":{"type":258,"value":"1","file":"eval code","line":1},"end":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"slice($a, 1, 2) ?>"}}, + "slice: empty": {"source":"{{ a[:] }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ] in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ] in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "access: empty": {"source":"{{ a[] }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ] in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ] in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "not without in": {"source":"{{ a not b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(b) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(b) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "is test": {"source":"{{ a is defined }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":363,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "enclosed": {"source":"{{ (a) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":356,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "enclosed empty": {"source":"{{ () }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "set: multiple": {"source":"{% set a = 1, b = 2 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"variable":{"type":265,"value":"b","file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "set: add assign": {"source":"{% set a += 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":281,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "set: sub assign": {"source":"{% set a -= 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":282,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "set: mul assign": {"source":"{% set a *= 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":283,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "set: div assign": {"source":"{% set a /= 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":284,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "set: dotted": {"source":"{% set a.b = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":"b = 1; ?>"}}, + "set: dotted access dotted": {"source":"{% set a.b[0].c = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":46,"left":{"type":361,"left":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":"b[0]->c = 1; ?>"}}, + "set: trailing comma": {"source":"{% set a = 1, %}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "include: plain": {"source":"{% include \"a\" %}","parse":{"outcome":"value","value":[{"type":313,"path":{"type":260,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file a does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "include: with": {"source":"{% include \"a\" with b %}","parse":{"outcome":"value","value":[{"type":313,"path":{"type":260,"value":"a","file":"eval code","line":1},"params":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"partial('a', $b); ?>"}}, + "include: expression": {"source":"{% include a ~ \".volt\" with {\"b\": c} %}","parse":{"outcome":"value","value":[{"type":313,"path":{"type":126,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":260,"value":".volt","file":"eval code","line":1},"file":"eval code","line":1},"params":{"type":360,"left":[{"expr":{"type":265,"value":"c","file":"eval code","line":1},"name":"b","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"partial($a . '.volt', ['b' => $c]); ?>"}}, + "extends: expression": {"source":"{% extends a ~ \"b\" %}","parse":{"outcome":"value","value":[{"type":310,"path":{"type":126,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":260,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "do": {"source":"{% do a %}","parse":{"outcome":"value","value":[{"type":316,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "return": {"source":"{% return a %}","parse":{"outcome":"value","value":[{"type":327,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "break outside for": {"source":"{% break %}","parse":{"outcome":"value","value":[{"type":320,"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "continue outside for": {"source":"{% continue %}","parse":{"outcome":"value","value":[{"type":319,"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "elsefor outside for": {"source":"{% elsefor %}","parse":{"outcome":"value","value":[{"type":321,"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}} + } +} diff --git a/tests/fixtures/parity/grammar-shape.php b/tests/fixtures/parity/grammar-shape.php new file mode 100644 index 0000000..63e14e7 --- /dev/null +++ b/tests/fixtures/parity/grammar-shape.php @@ -0,0 +1,109 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +/** + * The exact shape of the Lemon grammar: which bodies may be empty, which list + * forms exist, and the places where the conflict-resolved LALR automaton + * rejects input a "friendlier" grammar would accept (notably `{% call %}`, + * where `(` is both an operator and the statement's own delimiter). + */ + +return [ + // Empty / non-empty bodies + 'if: empty' => '{% if a %}{% endif %}', + 'if: empty both' => '{% if a %}{% else %}{% endif %}', + 'if: empty true non-empty else' => '{% if a %}{% else %}x{% endif %}', + 'if: non-empty true empty else' => '{% if a %}x{% else %}{% endif %}', + 'if: elseif chain' => '{% if a %}1{% elseif b %}2{% elseif c %}3{% else %}4{% endif %}', + 'if: elseif empty' => '{% if a %}{% elseif b %}{% endif %}', + 'for: empty' => '{% for x in y %}{% endfor %}', + 'for: else' => '{% for v in y %}x{% else %}y{% endfor %}', + 'for: elsefor' => '{% for v in y if v %}x{% elsefor %}y{% endfor %}', + 'for: key value if' => '{% for k, v in y if k %}x{% endfor %}', + 'for: if inside for else' => '{% for a in b %}{% if c %}x{% else %}y{% endif %}{% endfor %}', + 'for: else in if inside for' => '{% if a %}{% for b in c %}x{% else %}y{% endfor %}{% endif %}', + 'switch: empty' => '{% switch a %}{% endswitch %}', + 'switch: raw before case' => '{% switch a %} x {% case 1 %}y{% endswitch %}', + 'switch: cases' => '{% switch a %}{% case 1 %}x{% case 2 %}{% default %}z{% endswitch %}', + 'block: empty' => '{% block a %}{% endblock %}', + 'block: body' => '{% block a %}x{% endblock %}', + 'macro: empty' => '{% macro m() %}{% endmacro %}', + 'macro: body' => '{% macro m() %}x{% endmacro %}', + 'macro: defaults' => '{% macro m(a = 1, b = "x", c = 1.5, d = null, e = true, f = false) %}x{% endmacro %}', + 'macro: mixed params' => '{% macro m(a, b = 1, c) %}x{% endmacro %}', + 'autoescape: empty' => '{% autoescape true %}{% endautoescape %}', + 'autoescape: false' => '{% autoescape false %}x{% endautoescape %}', + 'verbatim: empty' => '{% verbatim %}{% endverbatim %}', + + // call + 'call: no args empty' => '{% call f() %}{% endcall %}', + 'call: no args body' => '{% call f() %}x{% endcall %}', + 'call: args empty' => '{% call f(1) %}{% endcall %}', + 'call: args body' => '{% call f(1) %}x{% endcall %}', + 'call: named args' => '{% call f("a": 1, 2) %}x{% endcall %}', + 'call: method' => '{% call a.b(1) %}x{% endcall %}', + 'call: chained' => '{% call a(1)(2) %}x{% endcall %}', + 'call: enclosed target' => '{% call (a)(1) %}x{% endcall %}', + 'call: binary target' => '{% call a + b(1) %}x{% endcall %}', + 'call: is target' => '{% call x is y() %}x{% endcall %}', + 'call: filter target' => '{% call a|b(1) %}x{% endcall %}', + + // Lists and items + 'array: empty' => '{{ [] }}', + 'array: hash empty' => '{{ {} }}', + 'array: trailing comma' => '{{ [1,] }}', + 'array: hash trailing comma' => '{{ {"a": 1, } }}', + 'array: identifier key' => '{{ {a: 1} }}', + 'array: named in brackets' => '{{ ["a": 1] }}', + 'array: mixed items' => '{{ [1, "a": 2, 3] }}', + 'array: integer key' => '{{ {1: 2} }}', + 'array: nested' => '{{ [[1, 2], {"a": [3]}] }}', + 'call: no args' => '{{ f() }}', + 'call: named arg' => '{{ f("a": 1) }}', + 'call: identifier named arg' => '{{ f(a: 1) }}', + 'call: trailing comma' => '{{ f(1,) }}', + + // Slices and access + 'slice: identifier offsets' => '{{ a[b:c] }}', + 'slice: dotted offset' => '{{ a[b.c:d] }}', + 'slice: expression offset' => '{{ a[1 + 2:3] }}', + 'slice: string offset' => '{{ a["x":1] }}', + 'slice: spaced' => '{{ a[1 : 2] }}', + 'slice: empty' => '{{ a[:] }}', + 'access: empty' => '{{ a[] }}', + + // Misc expressions + 'not without in' => '{{ a not b }}', + 'is test' => '{{ a is defined }}', + 'enclosed' => '{{ (a) }}', + 'enclosed empty' => '{{ () }}', + + // Statements + 'set: multiple' => '{% set a = 1, b = 2 %}', + 'set: add assign' => '{% set a += 1 %}', + 'set: sub assign' => '{% set a -= 1 %}', + 'set: mul assign' => '{% set a *= 1 %}', + 'set: div assign' => '{% set a /= 1 %}', + 'set: dotted' => '{% set a.b = 1 %}', + 'set: dotted access dotted' => '{% set a.b[0].c = 1 %}', + 'set: trailing comma' => '{% set a = 1, %}', + 'include: plain' => '{% include "a" %}', + 'include: with' => '{% include "a" with b %}', + 'include: expression' => '{% include a ~ ".volt" with {"b": c} %}', + 'extends: expression' => '{% extends a ~ "b" %}', + 'do' => '{% do a %}', + 'return' => '{% return a %}', + 'break outside for' => '{% break %}', + 'continue outside for' => '{% continue %}', + 'elsefor outside for' => '{% elsefor %}', +]; diff --git a/tests/fixtures/parity/harvested.json b/tests/fixtures/parity/harvested.json new file mode 100644 index 0000000..8c256e2 --- /dev/null +++ b/tests/fixtures/parity/harvested.json @@ -0,0 +1,584 @@ +{ + "generator": "ext-phalcon 5.23.0", + "cases": { + "cphalcon:CallMacroTest#1": {"source":"{{ str_replace(\"a\", \"b\", \"aabb\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"str_replace","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"aabb","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('str_replace', ['a', 'b', 'aabb']) ?>"}}, + "cphalcon:CallMacroTest#2": {"source":"{{ myfunction(\"a\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"myfunction","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('myfunction', ['a']) ?>"}}, + "cphalcon:Compiler/AddFilterTest#1": {"source":"{{ \"hello\"|reverse }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"hello","file":"eval code","line":1},"right":{"type":265,"value":"reverse","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter \"reverse\" in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "cphalcon:Compiler/AddFilterTest#2": {"source":"{{ \"1,2,3,4\"|separate }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"1,2,3,4","file":"eval code","line":1},"right":{"type":265,"value":"separate","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter \"separate\" in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "cphalcon:Compiler/AddFunctionTest#1": {"source":"{{ random() }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"random","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('random', []) ?>"}}, + "cphalcon:Compiler/AddFunctionTest#2": {"source":"{{ strtotime(\"now\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"strtotime","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"now","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('strtotime', ['now']) ?>"}}, + "cphalcon:Compiler/AddFunctionTest#3": {"source":"{{ shuffle(\"hello\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"shuffle","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('shuffle', ['hello']) ?>"}}, + "cphalcon:Compiler/AttributeReaderTest#1": {"source":"{{ a.b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"b ?>"}}, + "cphalcon:Compiler/AttributeReaderTest#2": {"source":"{{ a.b.c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"b->c ?>"}}, + "cphalcon:Compiler/CompileAutoEscapeTest#1": {"source":"{% autoescape true %}{{ \"hello\" }}{% endautoescape %}","parse":{"outcome":"value","value":[{"type":317,"enable":1,"block_statements":[{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"escaper->html('hello') ?>"}}, + "cphalcon:Compiler/CompileCaseTest#1": {"source":"{% switch x %}{% case 1 %}one{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"x","file":"eval code","line":1},"case_clauses":[{"type":412,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"one","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"one"}}, + "cphalcon:Compiler/CompileDoTest#1": {"source":"{% do a %}","parse":{"outcome":"value","value":[{"type":316,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileEchoTest#1": {"source":"{{ variable }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"variable","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileElseIfTest#1": {"source":"{% if i == 0 %}zero{% elseif i == 1 %}one{% else %}more than one{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":272,"left":{"type":265,"value":"i","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":"zero","file":"eval code","line":1},{"type":302,"expr":{"type":272,"left":{"type":265,"value":"i","file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"one","file":"eval code","line":1}],"false_statements":[{"type":357,"value":"more than one","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"zeroonemore than one"}}, + "cphalcon:Compiler/CompileForElseTest#1": {"source":"{% for a in b %}{{ a }}{% else %}empty{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"a","expr":{"type":265,"value":"b","file":"eval code","line":1},"block_statements":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},{"type":321,"file":"eval code","line":1},{"type":357,"value":"empty","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"empty"}}, + "cphalcon:Compiler/CompileForeachTest#1": {"source":"{% for item in items %}{{ item }}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"item","expr":{"type":265,"value":"items","file":"eval code","line":1},"block_statements":[{"type":359,"expr":{"type":265,"value":"item","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileIfTest#1": {"source":"{% if i == 0 %}zero{% else %}not zero{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":272,"left":{"type":265,"value":"i","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":"zero","file":"eval code","line":1}],"false_statements":[{"type":357,"value":"not zero","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"zeronot zero"}}, + "cphalcon:Compiler/CompileIfTest#2": {"source":"{% if categoryIds is defined AND category['id'] in categoryIds %}\n checked\n{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":266,"left":{"type":363,"left":{"type":265,"value":"categoryIds","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":309,"left":{"type":361,"left":{"type":265,"value":"category","file":"eval code","line":1},"right":{"type":260,"value":"id","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"categoryIds","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":"\n checked\n","file":"eval code","line":3}],"file":"eval code","line":3}]},"compile":{"outcome":"value","value":"isIncluded($category['id'], $categoryIds)) { ?>\n checked\n"}}, + "cphalcon:Compiler/CompileIncludeTest#1": {"source":"{% include templatePath %}","parse":{"outcome":"value","value":[{"type":313,"path":{"type":265,"value":"templatePath","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"partial($templatePath); ?>"}}, + "cphalcon:Compiler/CompileMacroTest#1": {"source":"{% macro myMacro() %}hello{% endmacro %}","parse":{"outcome":"value","value":[{"type":322,"name":"myMacro","block_statements":[{"type":357,"value":"hello","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"macros['myMacro'] = function() { ?>hellomacros['myMacro'] = \\Closure::bind($this->macros['myMacro'], $this); ?>"}}, + "cphalcon:Compiler/CompileReturnTest#1": {"source":"{% return true %}","parse":{"outcome":"value","value":[{"type":327,"expr":{"type":263,"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileSourceExtendsModeTest#1": {"source":"{# just a comment #}","parse":{"outcome":"value","value":[]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#1": {"source":"{# hello #}","parse":{"outcome":"value","value":[]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#2": {"source":"{# hello #}{# other comment #}","parse":{"outcome":"value","value":[]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#3": {"source":"{{ \"hello\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#4": {"source":"{{ \"hello\" }}{{ \"hello\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1},{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#5": {"source":"{{ \"hello\" }}-{{ \"hello\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"-","file":"eval code","line":1},{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"-"}}, + "cphalcon:Compiler/CompileStringTest#6": {"source":"-{{ \"hello\" }}{{ \"hello\" }}-","parse":{"outcome":"value","value":[{"type":357,"value":"-","file":"eval code","line":1},{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1},{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"-","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"--"}}, + "cphalcon:Compiler/CompileStringTest#7": {"source":"-{{ \"hello\" }}-{{ \"hello\" }}-","parse":{"outcome":"value","value":[{"type":357,"value":"-","file":"eval code","line":1},{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"-","file":"eval code","line":1},{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"-","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"---"}}, + "cphalcon:Compiler/CompileStringTest#8": {"source":"Some = {{ 100+50 }}","parse":{"outcome":"value","value":[{"type":357,"value":"Some = ","file":"eval code","line":1},{"type":359,"expr":{"type":43,"left":{"type":258,"value":"100","file":"eval code","line":1},"right":{"type":258,"value":"50","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"Some = "}}, + "cphalcon:Compiler/CompileStringTest#9": {"source":"Some = {{ 100-50 }}","parse":{"outcome":"value","value":[{"type":357,"value":"Some = ","file":"eval code","line":1},{"type":359,"expr":{"type":45,"left":{"type":258,"value":"100","file":"eval code","line":1},"right":{"type":258,"value":"50","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"Some = "}}, + "cphalcon:Compiler/CompileStringTest#10": {"source":"Some = {{ 100*50 }}","parse":{"outcome":"value","value":[{"type":357,"value":"Some = ","file":"eval code","line":1},{"type":359,"expr":{"type":42,"left":{"type":258,"value":"100","file":"eval code","line":1},"right":{"type":258,"value":"50","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"Some = "}}, + "cphalcon:Compiler/CompileStringTest#11": {"source":"Some = {{ 100/50 }}","parse":{"outcome":"value","value":[{"type":357,"value":"Some = ","file":"eval code","line":1},{"type":359,"expr":{"type":47,"left":{"type":258,"value":"100","file":"eval code","line":1},"right":{"type":258,"value":"50","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"Some = "}}, + "cphalcon:Compiler/CompileStringTest#12": {"source":"Some = {{ 100%50 }}","parse":{"outcome":"value","value":[{"type":357,"value":"Some = ","file":"eval code","line":1},{"type":359,"expr":{"type":37,"left":{"type":258,"value":"100","file":"eval code","line":1},"right":{"type":258,"value":"50","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"Some = "}}, + "cphalcon:Compiler/CompileStringTest#13": {"source":"Some = {{ 100~50 }}","parse":{"outcome":"value","value":[{"type":357,"value":"Some = ","file":"eval code","line":1},{"type":359,"expr":{"type":126,"left":{"type":258,"value":"100","file":"eval code","line":1},"right":{"type":258,"value":"50","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"Some = "}}, + "cphalcon:Compiler/CompileStringTest#14": {"source":"{{ -10 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":368,"right":{"type":258,"value":"10","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#15": {"source":"{{ !10 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":33,"right":{"type":258,"value":"10","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#16": {"source":"{{ !a }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":33,"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#17": {"source":"{{ not a }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":33,"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#18": {"source":"{% set a = [1, 2, 3, 4] %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":61,"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"4","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#19": {"source":"{% set a = [\"hello\", 2, 1.3, false, true, null] %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":61,"expr":{"type":360,"left":[{"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":259,"value":"1.3","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":262,"file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":263,"file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":261,"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#20": {"source":"{% set a = [\"hello\", 2, 3, false, true, null, [1, 2, \"hola\"]] %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":61,"expr":{"type":360,"left":[{"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":262,"file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":263,"file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":261,"file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"hola","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#21": {"source":"{% set a = ['first': 1, 'second': 2, 'third': 3] %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":61,"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"name":"first","file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"name":"second","file":"eval code","line":1},{"expr":{"type":258,"value":"3","file":"eval code","line":1},"name":"third","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":" 1, 'second' => 2, 'third' => 3]; ?>"}}, + "cphalcon:Compiler/CompileStringTest#22": {"source":"{{ a[0 ]}}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#23": {"source":"{{ a[0 ] [ 1]}}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#24": {"source":"{{ a[0] [ \"hello\"] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#25": {"source":"{{ a[0] [1.2] [false] [true] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":361,"left":{"type":361,"left":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":259,"value":"1.2","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":262,"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":263,"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#26": {"source":"{{ 1..100 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":276,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"100","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#27": {"source":"{{ \"Z\"..\"A\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":276,"left":{"type":260,"value":"Z","file":"eval code","line":1},"right":{"type":260,"value":"A","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#28": {"source":"{{ 'a'..'z' }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":276,"left":{"type":260,"value":"a","file":"eval code","line":1},"right":{"type":260,"value":"z","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#29": {"source":"{{ 'a' .. 'z' }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":276,"left":{"type":260,"value":"a","file":"eval code","line":1},"right":{"type":260,"value":"z","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#30": {"source":"{{ content() }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"content","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"getContent() ?>"}}, + "cphalcon:Compiler/CompileStringTest#31": {"source":"{{ get_content() }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"get_content","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"getContent() ?>"}}, + "cphalcon:Compiler/CompileStringTest#32": {"source":"{{ partial('hello/x') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"partial","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"hello/x","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"partial('hello/x') ?>"}}, + "cphalcon:Compiler/CompileStringTest#33": {"source":"{{ dump(a) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"dump","file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#34": {"source":"{{ date('Y-m-d', time()) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"date","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"Y-m-d","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":350,"name":{"type":265,"value":"time","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#35": {"source":"{{ robots.getPart(a) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"robots","file":"eval code","line":1},"right":{"type":265,"value":"getPart","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"getPart($a) ?>"}}, + "cphalcon:Compiler/CompileStringTest#36": {"source":"{{ link_to('hello', 'some-link') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"link_to","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"some-link","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#37": {"source":"{{ form_legacy('action': 'save/products', 'method': 'post') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"form_legacy","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"save/products","file":"eval code","line":1},"name":"action","file":"eval code","line":1},{"expr":{"type":260,"value":"post","file":"eval code","line":1},"name":"method","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" 'save/products', 'method' => 'post']) ?>"}}, + "cphalcon:Compiler/CompileStringTest#38": {"source":"{{ stylesheet_link(config.cdn.css.bootstrap, config.cdn.local) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"stylesheet_link","file":"eval code","line":1},"arguments":[{"expr":{"type":46,"left":{"type":46,"left":{"type":46,"left":{"type":265,"value":"config","file":"eval code","line":1},"right":{"type":265,"value":"cdn","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"css","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"bootstrap","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":46,"left":{"type":46,"left":{"type":265,"value":"config","file":"eval code","line":1},"right":{"type":265,"value":"cdn","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"local","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"cdn->css->bootstrap, $config->cdn->local) ?>"}}, + "cphalcon:Compiler/CompileStringTest#39": {"source":"{{ javascript_include('js/some.js') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"javascript_include","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"js/some.js","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#40": {"source":"{{ image('img/logo.png', 'width': 80) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"image","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"img/logo.png","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"80","file":"eval code","line":1},"name":"width","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" 80]) ?>"}}, + "cphalcon:Compiler/CompileStringTest#41": {"source":"{{ email_field('email', 'class': 'form-control', 'placeholder': 'Email Address') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"email_field","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"email","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"form-control","file":"eval code","line":1},"name":"class","file":"eval code","line":1},{"expr":{"type":260,"value":"Email Address","file":"eval code","line":1},"name":"placeholder","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" 'form-control', 'placeholder' => 'Email Address']) ?>"}}, + "cphalcon:Compiler/CompileStringTest#42": {"source":"{{ \"hello\"|e }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"hello","file":"eval code","line":1},"right":{"type":265,"value":"e","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"escaper->html('hello') ?>"}}, + "cphalcon:Compiler/CompileStringTest#43": {"source":"{{ \"hello\"|escape }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"hello","file":"eval code","line":1},"right":{"type":265,"value":"escape","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"escaper->html('hello') ?>"}}, + "cphalcon:Compiler/CompileStringTest#44": {"source":"{{ \"hello\"|trim }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"hello","file":"eval code","line":1},"right":{"type":265,"value":"trim","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#45": {"source":"{{ \"hello\"|striptags }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"hello","file":"eval code","line":1},"right":{"type":265,"value":"striptags","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#46": {"source":"{{ \"hello\"|json_encode }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"hello","file":"eval code","line":1},"right":{"type":265,"value":"json_encode","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#47": {"source":"{{ \"hello\"|url_encode }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"hello","file":"eval code","line":1},"right":{"type":265,"value":"url_encode","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#48": {"source":"{{ \"hello\"|uppercase }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"hello","file":"eval code","line":1},"right":{"type":265,"value":"uppercase","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#49": {"source":"{{ \"hello\"|lowercase }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"hello","file":"eval code","line":1},"right":{"type":265,"value":"lowercase","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#50": {"source":"{{ (\"hello\" ~ \"lol\")|e|length }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":124,"left":{"type":356,"left":{"type":126,"left":{"type":260,"value":"hello","file":"eval code","line":1},"right":{"type":260,"value":"lol","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"e","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"length","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"length($this->escaper->html(('hello' . 'lol'))) ?>"}}, + "cphalcon:Compiler/CompileStringTest#51": {"source":"{{ \"My name is %s, %s\"|format(name, \"thanks\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"My name is %s, %s","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"format","file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"name","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"thanks","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#52": {"source":"{{ \"some name\"|convert_encoding(\"utf-8\", \"latin1\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"some name","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"convert_encoding","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"utf-8","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"latin1","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"convertEncoding('some name', 'utf-8', 'latin1') ?>"}}, + "cphalcon:Compiler/CompileStringTest#53": {"source":"{% if a==b %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":272,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#54": {"source":"{% if a!=b %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":273,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#55": {"source":"{% if a is not b %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":273,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#56": {"source":"{% if a hello "}}, + "cphalcon:Compiler/CompileStringTest#57": {"source":"{% if a>b %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":62,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" $b) { ?> hello "}}, + "cphalcon:Compiler/CompileStringTest#58": {"source":"{% if a>=b %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":271,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"= $b) { ?> hello "}}, + "cphalcon:Compiler/CompileStringTest#59": {"source":"{% if a<=b %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":270,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#60": {"source":"{% if a===b %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":274,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#61": {"source":"{% if a!==b %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":275,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#62": {"source":"{% if a==b and c==d %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":266,"left":{"type":272,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":272,"left":{"type":265,"value":"c","file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#63": {"source":"{% if a==b or c==d %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":267,"left":{"type":272,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":272,"left":{"type":265,"value":"c","file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#64": {"source":"{% if a is odd %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":388,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#65": {"source":"{% if a is even %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":387,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#66": {"source":"{% if a is empty %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":386,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#67": {"source":"{% if a is not empty %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":392,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#68": {"source":"{% if a is numeric %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":389,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#69": {"source":"{% if a is not numeric %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":395,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#70": {"source":"{% if a is scalar %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":390,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#71": {"source":"{% if a is not scalar %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":396,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#72": {"source":"{% if a is iterable %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":391,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#73": {"source":"{% if a is not iterable %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":397,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#74": {"source":"{% if a is sameas(false) %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":311,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"sameas","file":"eval code","line":1},"arguments":[{"expr":{"type":262,"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#75": {"source":"{% if a is sameas(b) %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":311,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"sameas","file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#76": {"source":"{% if a is divisibleby(3) %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":311,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"divisibleby","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#77": {"source":"{% if a is divisibleby(b) %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":311,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"divisibleby","file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#78": {"source":"{% if a is defined %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":363,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#79": {"source":"{% if a is not defined %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":362,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#80": {"source":"{% if a==b %} hello {% else %} not hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":272,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"false_statements":[{"type":357,"value":" not hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello not hello "}}, + "cphalcon:Compiler/CompileStringTest#81": {"source":"{% if a==b %} {% if c==d %} hello {% endif %} {% else %} not hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":272,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" ","file":"eval code","line":1},{"type":300,"expr":{"type":272,"left":{"type":265,"value":"c","file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1},{"type":357,"value":" ","file":"eval code","line":1}],"false_statements":[{"type":357,"value":" not hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello not hello "}}, + "cphalcon:Compiler/CompileStringTest#82": {"source":"{% if a==b %} {% if c==d %} hello {% else %} not hello {% endif %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":272,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" ","file":"eval code","line":1},{"type":300,"expr":{"type":272,"left":{"type":265,"value":"c","file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"false_statements":[{"type":357,"value":" not hello ","file":"eval code","line":1}],"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello not hello "}}, + "cphalcon:Compiler/CompileStringTest#83": {"source":"{% if a==b %} hello {% else %} {% if c==d %} not hello {% endif %} {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":272,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"false_statements":[{"type":357,"value":" ","file":"eval code","line":1},{"type":300,"expr":{"type":272,"left":{"type":265,"value":"c","file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" not hello ","file":"eval code","line":1}],"file":"eval code","line":1},{"type":357,"value":" ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello not hello "}}, + "cphalcon:Compiler/CompileStringTest#84": {"source":"{% if a is empty or a is defined %} hello {% else %} not hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":267,"left":{"type":386,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":363,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"false_statements":[{"type":357,"value":" not hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello not hello "}}, + "cphalcon:Compiler/CompileStringTest#85": {"source":"{% if a is even or b is odd %} hello {% else %} not hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":267,"left":{"type":387,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":388,"left":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"false_statements":[{"type":357,"value":" not hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello not hello "}}, + "cphalcon:Compiler/CompileStringTest#86": {"source":"{% for a in b %} hello {% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"a","expr":{"type":265,"value":"b","file":"eval code","line":1},"block_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#87": {"source":"{% for a in b[0] %} hello {% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"a","expr":{"type":361,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#88": {"source":"{% for a in b.c %} hello {% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"a","expr":{"type":46,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"c as $a) { ?> hello "}}, + "cphalcon:Compiler/CompileStringTest#89": {"source":"{% for key, value in [0, 1, 3, 5, 4] %} hello {% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"value","key":"key","expr":{"type":360,"left":[{"expr":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"5","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"4","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"block_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" $value) { ?> hello "}}, + "cphalcon:Compiler/CompileStringTest#90": {"source":"{% for key, value in [0, 1, 3, 5, 4] if key!=3 %} hello {% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"value","key":"key","expr":{"type":360,"left":[{"expr":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"5","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"4","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"if_expr":{"type":273,"left":{"type":265,"value":"key","file":"eval code","line":1},"right":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" $value) { if ($key != 3) { ?> hello "}}, + "cphalcon:Compiler/CompileStringTest#91": {"source":"{% for a in 1..10 %} hello {% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"a","expr":{"type":276,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"10","file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#92": {"source":"{% for a in 1..10 if a is even %} hello {% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"a","expr":{"type":276,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"10","file":"eval code","line":1},"file":"eval code","line":1},"if_expr":{"type":387,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#93": {"source":"{% for a in 1..10 %} {% for b in 1..10 %} hello {% endfor %} {% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"a","expr":{"type":276,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"10","file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":357,"value":" ","file":"eval code","line":1},{"type":304,"variable":"b","expr":{"type":276,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"10","file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1},{"type":357,"value":" ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/CompileStringTest#94": {"source":"{% for a in 1..10 %}{% break %}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"a","expr":{"type":276,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"10","file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":320,"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#95": {"source":"{% for a in 1..10 %}{% continue %}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"a","expr":{"type":276,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"10","file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":319,"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#96": {"source":"{% set a = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#97": {"source":"{% set a = a-1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":61,"expr":{"type":45,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#98": {"source":"{% set a = 1.2 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":61,"expr":{"type":259,"value":"1.2","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#99": {"source":"{% set a = 1.2+1*(20/b) and c %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":61,"expr":{"type":266,"left":{"type":42,"left":{"type":43,"left":{"type":259,"value":"1.2","file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":356,"left":{"type":47,"left":{"type":258,"value":"20","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#100": {"source":"{{ \"hello\" }}{% autoescape true %}{{ \"hello\" }}{% autoescape false %}{{ \"hello\" }}{% endautoescape %}{{ \"hello\" }}{% endautoescape %}{{ \"hello\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1},{"type":317,"enable":1,"block_statements":[{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1},{"type":317,"enable":0,"block_statements":[{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"escaper->html('hello') ?>escaper->html('hello') ?>"}}, + "cphalcon:Compiler/CompileStringTest#101": {"source":"{# some comment #}{{ \"hello\" }}{# other comment }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#102": {"source":"{{ [1, 2]|join(',') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"join","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":",","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#103": {"source":"{{ [1, 2]|join(\"'\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"join","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"'","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#104": {"source":"{{ [\"x\", \"y\"]|join(\"' . phpinfo() . '\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":360,"left":[{"expr":{"type":260,"value":"x","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"y","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"join","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"' . phpinfo() . '","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#105": {"source":"{{ readonly|default(false) ? 'readonly=\"readonly\"' : '' }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":124,"left":{"type":265,"value":"readonly","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"default","file":"eval code","line":1},"arguments":[{"expr":{"type":262,"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"left":{"type":260,"value":"readonly=\"readonly\"","file":"eval code","line":1},"right":{"type":260,"value":"","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#106": {"source":"{{ 'Let\\'s Encrypt' }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"Let\\'s Encrypt","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#107": {"source":"{{ \"say 'hi'\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"say 'hi'","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#108": {"source":"{% set ga_action=\"send_ga('Link', 'External', '\" ~ item.title|striptags|url_encode ~ \"');\" %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"ga_action","file":"eval code","line":1},"op":61,"expr":{"type":126,"left":{"type":126,"left":{"type":260,"value":"send_ga('Link', 'External', '","file":"eval code","line":1},"right":{"type":124,"left":{"type":124,"left":{"type":46,"left":{"type":265,"value":"item","file":"eval code","line":1},"right":{"type":265,"value":"title","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"striptags","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"url_encode","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":260,"value":"');","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":"title)) . '\\');'; ?>"}}, + "cphalcon:Compiler/CompileStringTest#109": {"source":"{% set x = \"it's\" %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"x","file":"eval code","line":1},"op":61,"expr":{"type":260,"value":"it's","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#110": {"source":"{{ tag.textField('x\".system(\"id\").\"') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"tag","file":"eval code","line":1},"right":{"type":265,"value":"textField","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"x\".system(\"id\").\"","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"textField(\"x\\\".system(\\\"id\\\").\\\"\") ?>"}}, + "cphalcon:Compiler/CompileStringTest#111": {"source":"{{ tag.textField('{${system(chr(105).chr(100))}}') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"tag","file":"eval code","line":1},"right":{"type":265,"value":"textField","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"{${system(chr(105).chr(100))}}","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"textField(\"{\\${system(chr(105).chr(100))}}\") ?>"}}, + "cphalcon:Compiler/CompileStringTest#112": {"source":"{{ tag.textField('x\\\\\"') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"tag","file":"eval code","line":1},"right":{"type":265,"value":"textField","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"x\\\\\"","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"textField(\"x\\\\\\\"\") ?>"}}, + "cphalcon:Compiler/CompileStringTest#113": {"source":"{{ tag.textField('\\t') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"tag","file":"eval code","line":1},"right":{"type":265,"value":"textField","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"\\t","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"textField(\"\\t\") ?>"}}, + "cphalcon:Compiler/CompileStringTest#114": {"source":"{{ tag.textField('\\\\t') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"tag","file":"eval code","line":1},"right":{"type":265,"value":"textField","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"\\\\t","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"textField(\"\\\\t\") ?>"}}, + "cphalcon:Compiler/CompileStringTest#115": {"source":"{{ tag.textField('-') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"tag","file":"eval code","line":1},"right":{"type":265,"value":"textField","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"-","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"textField(\"-\") ?>"}}, + "cphalcon:Compiler/CompileStringTest#116": {"source":"{{ tag.textField('+') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"tag","file":"eval code","line":1},"right":{"type":265,"value":"textField","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"+","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"textField(\"+\") ?>"}}, + "cphalcon:Compiler/CompileStringTest#117": {"source":"{{ tag.textField('\t') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"tag","file":"eval code","line":1},"right":{"type":265,"value":"textField","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"\t","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"textField(\"\t\") ?>"}}, + "cphalcon:Compiler/CompileStringTest#118": {"source":"{{ [\"x' => system('id'), 'y\": 1] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"name":"x' => system('id'), 'y","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" system(\\'id\\'), \\'y' => 1] ?>"}}, + "cphalcon:Compiler/CompileStringTest#119": {"source":"{% set x = [\"a' => system('id'), 'b\": 1] %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"x","file":"eval code","line":1},"op":61,"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"name":"a' => system('id'), 'b","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":" system(\\'id\\'), \\'b' => 1]; ?>"}}, + "cphalcon:Compiler/CompileStringTest#120": {"source":"{{ [\"x\\\\'\": 1] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"name":"x\\\\'","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" 1] ?>"}}, + "cphalcon:Compiler/CompileStringTest#121": {"source":"{{ [\"it's\": 1] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"name":"it's","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" 1] ?>"}}, + "cphalcon:Compiler/CompileStringTest#122": {"source":"{{ ['it\\'s': 1] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"name":"it\\'s","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" 1] ?>"}}, + "cphalcon:Compiler/CompileStringTest#123": {"source":"{{ \"x\\\\'.injected();//\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"x\\\\'.injected();//","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#124": {"source":"{{ \"x\\\\'\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"x\\\\'","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#125": {"source":"{{ \"it's\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"it's","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#126": {"source":"{{ \"\\t\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"\\t","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#127": {"source":"{{ \"\\\\t\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"\\\\t","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#128": {"source":"{{ \"hello\"|unknown }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"hello","file":"eval code","line":1},"right":{"type":265,"value":"unknown","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter \"unknown\" in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "cphalcon:Compiler/CompileStringTest#129": {"source":"{{ \"hello\"|unknown(1, 2, 3) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"hello","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"unknown","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter \"unknown\" in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "cphalcon:Compiler/CompileStringTest#130": {"source":"{{ \"hello\"|(a-1) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"hello","file":"eval code","line":1},"right":{"type":356,"left":{"type":45,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter type in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilterType"}}, + "cphalcon:Compiler/CompileStringTest#131": {"source":"[P[{% block body %}{% endblock %}]]","parse":{"outcome":"value","value":[{"type":357,"value":"[P[","file":"eval code","line":1},{"type":307,"name":"body","file":"eval code","line":1},{"type":357,"value":"]]","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"[P[]]"}}, + "cphalcon:Compiler/CompileStringTest#132": {"source":"{% extends '","parse":{"outcome":"throw","value":"Scanning error before '' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before '' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/CompileStringTest#133": {"source":"parent.volt' %}{% block body %}[C]{% endblock %}","parse":{"outcome":"value","value":[{"type":357,"value":"parent.volt' %}","file":"eval code","line":1},{"type":307,"name":"body","block_statements":[{"type":357,"value":"[C]","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"parent.volt' %}[C]"}}, + "cphalcon:Compiler/CompileStringTest#134": {"source":"{{ \"x\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"x","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileStringTest#135": {"source":"{{ tag.doctype(5, '-') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"tag","file":"eval code","line":1},"right":{"type":265,"value":"doctype","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"5","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"-","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"doctype(5, \"-\") ?>"}}, + "cphalcon:Compiler/CompileStringTest#136": {"source":"{{ tag.title('+', '-') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"tag","file":"eval code","line":1},"right":{"type":265,"value":"title","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"+","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"-","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"title(\"+\", \"-\") ?>"}}, + "cphalcon:Compiler/CompileStringTest#137": {"source":"{{ tag.title('\t', '\n\n') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"tag","file":"eval code","line":1},"right":{"type":265,"value":"title","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"\t","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"\n\n","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"title(\"\t\", \"\n\n\") ?>"}}, + "cphalcon:Compiler/CompileStringTest#138": {"source":"{{ tag.style().add('/css/some.css') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":350,"name":{"type":46,"left":{"type":265,"value":"tag","file":"eval code","line":1},"right":{"type":265,"value":"style","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"add","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"/css/some.css","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"style()->add(\"/css/some.css\") ?>"}}, + "cphalcon:Compiler/CompileStringTest#139": {"source":"{{ tag.script().add('/js/some.js') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":350,"name":{"type":46,"left":{"type":265,"value":"tag","file":"eval code","line":1},"right":{"type":265,"value":"script","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"add","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"/js/some.js","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"script()->add(\"/js/some.js\") ?>"}}, + "cphalcon:Compiler/CompileStringTest#140": {"source":"{{ [","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/CompileStringTest#141": {"source":"{{ \"abc\\","parse":{"outcome":"throw","value":"Scanning error before 'abc\\' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before 'abc\\' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/CompileStringTest#142": {"source":"{{ 'abc\\","parse":{"outcome":"throw","value":"Scanning error before 'abc\\' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before 'abc\\' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/CompileSwitchTest#1": {"source":"{% switch x %}{% case 1 %}one{% default %}other{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"x","file":"eval code","line":1},"case_clauses":[{"type":412,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"one","file":"eval code","line":1},{"type":413,"file":"eval code","line":1},{"type":357,"value":"other","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"oneother"}}, + "cphalcon:Compiler/CompileSwitchTest#2": {"source":"{% set aNumber = 1 %}\n{% switch aNumber %}\n {% case 0 %}\n {{ greatText }}\n {% break %}\n {% case 1 %}\n {{ false|default('simple text') }}\n {% break %}\n{% endswitch %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"aNumber","file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]},{"type":357,"value":"\n","file":"eval code","line":2},{"type":411,"expr":{"type":265,"value":"aNumber","file":"eval code","line":2},"case_clauses":[{"type":357,"value":"\n ","file":"eval code","line":3},{"type":412,"expr":{"type":258,"value":"0","file":"eval code","line":3},"file":"eval code","line":4},{"type":357,"value":"\n ","file":"eval code","line":4},{"type":359,"expr":{"type":265,"value":"greatText","file":"eval code","line":4},"file":"eval code","line":5},{"type":357,"value":"\n ","file":"eval code","line":5},{"type":320,"file":"eval code","line":6},{"type":357,"value":"\n ","file":"eval code","line":6},{"type":412,"expr":{"type":258,"value":"1","file":"eval code","line":6},"file":"eval code","line":7},{"type":357,"value":"\n ","file":"eval code","line":7},{"type":359,"expr":{"type":124,"left":{"type":262,"file":"eval code","line":7},"right":{"type":350,"name":{"type":265,"value":"default","file":"eval code","line":7},"arguments":[{"expr":{"type":260,"value":"simple text","file":"eval code","line":7},"file":"eval code","line":7}],"file":"eval code","line":7},"file":"eval code","line":7},"file":"eval code","line":8},{"type":357,"value":"\n ","file":"eval code","line":8},{"type":320,"file":"eval code","line":9},{"type":357,"value":"\n","file":"eval code","line":9}],"file":"eval code","line":9}]},"compile":{"outcome":"value","value":"\n\n\n\n\n\n\n\n"}}, + "cphalcon:Compiler/CompileSwitchTest#3": {"source":"{% switch x %}{% case 1 %}one{% default %}other{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"x","file":"eval code","line":1},"case_clauses":[{"type":412,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"one","file":"eval code","line":1},{"type":413,"file":"eval code","line":1},{"type":357,"value":"other","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"oneother"}}, + "cphalcon:Compiler/CompileSwitchTest#4": {"source":"{% switch x %}{% case 1 %}one{%- default -%}other{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"x","file":"eval code","line":1},"case_clauses":[{"type":412,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"one","file":"eval code","line":1},{"type":413,"file":"eval code","line":1},{"type":357,"value":"other","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"oneother"}}, + "cphalcon:Compiler/CompileSwitchTest#5": {"source":"{% switch x %}{% case 1 %}one{% default %}{{ value|default('unknown') }}{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"x","file":"eval code","line":1},"case_clauses":[{"type":412,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"one","file":"eval code","line":1},{"type":413,"file":"eval code","line":1},{"type":359,"expr":{"type":124,"left":{"type":265,"value":"value","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"default","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"unknown","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"one"}}, + "cphalcon:Compiler/CompileSwitchTest#6": {"source":"{{ value|default('unknown') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":265,"value":"value","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"default","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"unknown","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileSwitchTest#7": {"source":"{% switch x %}{% case 1 %}{% set default = 'abc' %}{{ default }}{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"x","file":"eval code","line":1},"case_clauses":[{"type":412,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"type":306,"assignments":[{"variable":{"type":265,"value":"default","file":"eval code","line":1},"op":61,"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}]},{"type":359,"expr":{"type":265,"value":"default","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/CompileTest#1": {"source":"{% block content %}Hello{% endblock %}","parse":{"outcome":"value","value":[{"type":307,"name":"content","block_statements":[{"type":357,"value":"Hello","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"Hello"}}, + "cphalcon:Compiler/FireExtensionEventTest#1": {"source":"{{ add_extension() }}a{{ 1 }}b","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"add_extension","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"a","file":"eval code","line":1},{"type":359,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"b","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('add_extension', []) ?>ab"}}, + "cphalcon:Compiler/FireExtensionEventTest#2": {"source":"ext_raw{{ ext_function() }}{{ \"ext_expression\" }}{{ 1|ext_filter }}{{ \"other\" }}","parse":{"outcome":"value","value":[{"type":357,"value":"ext_raw","file":"eval code","line":1},{"type":359,"expr":{"type":350,"name":{"type":265,"value":"ext_function","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},{"type":359,"expr":{"type":260,"value":"ext_expression","file":"eval code","line":1},"file":"eval code","line":1},{"type":359,"expr":{"type":124,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":265,"value":"ext_filter","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},{"type":359,"expr":{"type":260,"value":"other","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter \"ext_filter\" in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "cphalcon:Compiler/FunctionCallTest#1": {"source":"{{ partial(\"abc.volt\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"partial","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc.volt","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"partial('abc.volt') ?>"}}, + "cphalcon:Compiler/FunctionCallTest#2": {"source":"{{ link_to('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"link_to","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#3": {"source":"{{ image('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"image","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#4": {"source":"{{ form_legacy('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"form_legacy","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#5": {"source":"{{ submit_button('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"submit_button","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#6": {"source":"{{ radio_field('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"radio_field","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#7": {"source":"{{ check_field('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"check_field","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#8": {"source":"{{ file_field('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"file_field","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#9": {"source":"{{ hidden_field('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"hidden_field","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#10": {"source":"{{ password_field('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"password_field","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#11": {"source":"{{ text_area('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"text_area","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#12": {"source":"{{ text_field('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"text_field","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#13": {"source":"{{ email_field('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"email_field","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#14": {"source":"{{ date_field('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"date_field","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#15": {"source":"{{ tel_field('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"tel_field","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#16": {"source":"{{ numeric_field('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"numeric_field","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#17": {"source":"{{ image_input('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"image_input","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#18": {"source":"{{ url('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"url","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"url->get('abc') ?>"}}, + "cphalcon:Compiler/FunctionCallTest#19": {"source":"{{ static_url('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"static_url","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"url->getStatic('abc') ?>"}}, + "cphalcon:Compiler/FunctionCallTest#20": {"source":"{{ date('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"date","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#21": {"source":"{{ time() }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"time","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#22": {"source":"{{ dump('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"dump","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#23": {"source":"{{ version() }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"version","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"get() ?>"}}, + "cphalcon:Compiler/FunctionCallTest#24": {"source":"{{ version_id() }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"version_id","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"getId() ?>"}}, + "cphalcon:Compiler/FunctionCallTest#25": {"source":"{{ constant('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"constant","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#26": {"source":"{{ preload('abc.css') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"preload","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc.css","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"preload('abc.css') ?>"}}, + "cphalcon:Compiler/FunctionCallTest#27": {"source":"{{ preload('abc.jpg', ['as' : 'image']) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"preload","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc.jpg","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"image","file":"eval code","line":1},"name":"as","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"preload('abc.jpg', ['as' => 'image']) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#28": {"source":"{{ somefunction('abc') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"somefunction","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('somefunction', ['abc']) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#29": {"source":"{{ \"abc\" | length }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"length","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"length('abc') ?>"}}, + "cphalcon:Compiler/FunctionCallTest#30": {"source":"{{ \"abc\" | e }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"e","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"escaper->html('abc') ?>"}}, + "cphalcon:Compiler/FunctionCallTest#31": {"source":"{{ \"abc\" | escape }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"escape","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"escaper->html('abc') ?>"}}, + "cphalcon:Compiler/FunctionCallTest#32": {"source":"{{ \"abc\" | escape_css }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"escape_css","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"escaper->css('abc') ?>"}}, + "cphalcon:Compiler/FunctionCallTest#33": {"source":"{{ \"abc\" | escape_js }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"escape_js","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"escaper->js('abc') ?>"}}, + "cphalcon:Compiler/FunctionCallTest#34": {"source":"{{ \"abc\" | escape_attr }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"escape_attr","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"escaper->attributes('abc') ?>"}}, + "cphalcon:Compiler/FunctionCallTest#35": {"source":"{{ \"abc\" | trim }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"trim","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#36": {"source":"{{ \"abc\" | left_trim }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"left_trim","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#37": {"source":"{{ \"abc\" | right_trim }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"right_trim","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#38": {"source":"{{ \"abc\" | striptags }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"striptags","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#39": {"source":"{{ \"abc\" | url_encode }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"url_encode","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#40": {"source":"{{ \"abc\" | slashes }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"slashes","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#41": {"source":"{{ \"abc\" | stripslashes }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"stripslashes","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#42": {"source":"{{ \"abc\" | nl2br }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"nl2br","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#43": {"source":"{{ \"abc\" | keys }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"keys","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#44": {"source":"{{ [\"abc\", \"def\"] | join(\",\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":360,"left":[{"expr":{"type":260,"value":"abc","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"def","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"join","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":",","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#45": {"source":"{{ \"abc\" | lower }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"lower","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#46": {"source":"{{ \"abc\" | lowercase }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"lowercase","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#47": {"source":"{{ \"abc\" | upper }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"upper","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#48": {"source":"{{ \"abc\" | uppercase }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"uppercase","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#49": {"source":"{{ \"abc\" | capitalize }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"capitalize","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#50": {"source":"{{ \"abc\" | sort }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"sort","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"sort('abc') ?>"}}, + "cphalcon:Compiler/FunctionCallTest#51": {"source":"{{ \"abc\" | json_encode }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"json_encode","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#52": {"source":"{{ \"abc\" | json_decode }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"json_decode","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#53": {"source":"{{ \"abc\" | format }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"format","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#54": {"source":"{{ \"abc\" | abs }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"abs","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#55": {"source":"{{ \"abc\" | slice }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"slice","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"slice('abc') ?>"}}, + "cphalcon:Compiler/FunctionCallTest#56": {"source":"{{ \"abc\" | default(\"def\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"default","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"def","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/FunctionCallTest#57": {"source":"{{ \"abc\" | convert_encoding }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"abc","file":"eval code","line":1},"right":{"type":265,"value":"convert_encoding","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"convertEncoding('abc') ?>"}}, + "cphalcon:Compiler/FunctionCallTest#58": {"source":"{{ a(\"https://phalcon.io/\", \"home\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"a","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"https://phalcon.io/","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"home","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('a', ['https://phalcon.io/', 'home']) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#59": {"source":"{{ base(\"https://phalcon.io/\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"base","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"https://phalcon.io/","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('base', ['https://phalcon.io/']) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#60": {"source":"{{ body() }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"body","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('body', []) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#61": {"source":"{{ button(\"close\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"button","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"close","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('button', ['close', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#62": {"source":"{{ close(\"form\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"close","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"form","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('close', ['form']) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#63": {"source":"{{ doctype(5, \"\\n\\n\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"doctype","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"5","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"\\n\\n","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('doctype', [5, '\\n\\n']) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#64": {"source":"{{ element(\"button\", \"close\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"element","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"button","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"close","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('element', ['button', 'close', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#65": {"source":"{{ form([\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"form","file":"eval code","line":1},"arguments":[{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('form', [['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#66": {"source":"{{ img(\"/img/abc.jpg\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"img","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"/img/abc.jpg","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('img', ['/img/abc.jpg']) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#67": {"source":"{{ inputCheckbox(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputCheckbox","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputCheckbox', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#68": {"source":"{{ inputColor(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputColor","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputColor', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#69": {"source":"{{ inputDate(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputDate","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputDate', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#70": {"source":"{{ inputDateTime(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputDateTime","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputDateTime', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#71": {"source":"{{ inputDateTimeLocal(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputDateTimeLocal","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputDateTimeLocal', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#72": {"source":"{{ inputEmail(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputEmail","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputEmail', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#73": {"source":"{{ inputFile(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputFile","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputFile', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#74": {"source":"{{ inputHidden(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputHidden","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputHidden', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#75": {"source":"{{ inputImage(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputImage","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputImage', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#76": {"source":"{{ inputInput(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputInput","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputInput', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#77": {"source":"{{ inputMonth(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputMonth","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputMonth', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#78": {"source":"{{ inputNumeric(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputNumeric","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputNumeric', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#79": {"source":"{{ inputPassword(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputPassword","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputPassword', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#80": {"source":"{{ inputRadio(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputRadio","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputRadio', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#81": {"source":"{{ inputRange(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputRange","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputRange', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#82": {"source":"{{ inputSearch(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputSearch","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputSearch', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#83": {"source":"{{ inputSelect(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputSelect","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputSelect', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#84": {"source":"{{ inputSubmit(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputSubmit","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputSubmit', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#85": {"source":"{{ inputTel(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputTel","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputTel', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#86": {"source":"{{ inputText(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputText","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputText', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#87": {"source":"{{ inputTextarea(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputTextarea","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputTextarea', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#88": {"source":"{{ inputTime(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputTime","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputTime', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#89": {"source":"{{ inputUrl(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputUrl","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputUrl', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#90": {"source":"{{ inputWeek(\"test\", \"1\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"inputWeek","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('inputWeek', ['test', '1', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#91": {"source":"{{ label(\"test\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"label","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('label', ['test', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#92": {"source":"{{ link(\"\\t\", \"\\n\\n\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"link","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"\\t","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"\\n\\n","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('link', ['\\t', '\\n\\n']) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#93": {"source":"{{ meta(\"\\t\", \"\\n\\n\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"meta","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"\\t","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"\\n\\n","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('meta', ['\\t', '\\n\\n']) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#94": {"source":"{{ ol(\"test\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"ol","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('ol', ['test', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#95": {"source":"{{ script(\"\\t\", \"\\n\\n\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"script","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"\\t","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"\\n\\n","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('script', ['\\t', '\\n\\n']) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#96": {"source":"{{ style(\"\\t\", \"\\n\\n\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"style","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"\\t","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"\\n\\n","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('style', ['\\t', '\\n\\n']) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#97": {"source":"{{ title(\"\\t\", \"\\n\\n\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"title","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"\\t","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"\\n\\n","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('title', ['\\t', '\\n\\n']) ?>"}}, + "cphalcon:Compiler/FunctionCallTest#98": {"source":"{{ ul(\"test\", [\"class\" : \"label label-info\"]) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"ul","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"test","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":260,"value":"label label-info","file":"eval code","line":1},"name":"class","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('ul', ['test', ['class' => 'label label-info']]) ?>"}}, + "cphalcon:Compiler/ParseTest#1": {"source":"{{ \"hello\"}}{% extends \"some/file.volt\" %}","parse":{"outcome":"throw","value":"Extends statement must be placed at the first line in the template in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Extends statement must be placed at the first line in the template in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/ParseTest#2": {"source":"
{% extends \"some/file.volt\" %}{% set a = 1 %}
","parse":{"outcome":"throw","value":"Extends statement must be placed at the first line in the template in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Extends statement must be placed at the first line in the template in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/ParseTest#3": {"source":"{% extends \"some/file.volt\" %}{{ \"hello\"}}","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/ParseTest#4": {"source":"{% extends \"some/file.volt\" %}{{% if true %}} {%endif%}","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/ParseTest#5": {"source":"{% extends \"some/file.volt\" %}{{% set a = 1 %}","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/ParseTest#6": {"source":"{{ 1 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#7": {"source":"{{ 1.2 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":259,"value":"1.2","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#8": {"source":"{{ false }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":262,"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#9": {"source":"{{ true }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":263,"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#10": {"source":"{{ null }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":261,"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#11": {"source":"{{ \"'hello'\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"'hello'","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#12": {"source":"{{ a[0 ][1]}}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#13": {"source":"{{ a[0][\"hello\"] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#14": {"source":"{{ a[0][1.2][false][true] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":361,"left":{"type":361,"left":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":259,"value":"1.2","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":262,"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":263,"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#15": {"source":"{{ a[0][1.2][false][true][b] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":361,"left":{"type":361,"left":{"type":361,"left":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":259,"value":"1.2","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":262,"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":263,"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#16": {"source":"{{ (a.b).c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":356,"left":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"b)->c ?>"}}, + "cphalcon:Compiler/ParseTest#17": {"source":"{{ a.(b.c) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":356,"left":{"type":46,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"($b->c) ?>"}}, + "cphalcon:Compiler/ParseTest#18": {"source":"{{ 10-- }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":280,"left":{"type":258,"value":"10","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown expression 280 in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltExpression"}}, + "cphalcon:Compiler/ParseTest#19": {"source":"{{ !!10 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":33,"right":{"type":33,"right":{"type":258,"value":"10","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#20": {"source":"{{ contents() }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"contents","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('contents', []) ?>"}}, + "cphalcon:Compiler/ParseTest#21": {"source":"{{ form('action': 'save/products', 'method': 'post') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"form","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"save/products","file":"eval code","line":1},"name":"action","file":"eval code","line":1},{"expr":{"type":260,"value":"post","file":"eval code","line":1},"name":"method","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('form', ['action' => 'save/products', 'method' => 'post']) ?>"}}, + "cphalcon:Compiler/ParseTest#22": {"source":"{{ form('action': 'save/products', 'method': other_func(1, 2, 3)) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"form","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"save/products","file":"eval code","line":1},"name":"action","file":"eval code","line":1},{"expr":{"type":350,"name":{"type":265,"value":"other_func","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"name":"method","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('form', ['action' => 'save/products', 'method' => $this->callMacro('other_func', [1, 2, 3])]) ?>"}}, + "cphalcon:Compiler/ParseTest#23": {"source":"{{ flash.outputMessages() }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"flash","file":"eval code","line":1},"right":{"type":265,"value":"outputMessages","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"outputMessages() ?>"}}, + "cphalcon:Compiler/ParseTest#24": {"source":"{{ session.get('hello') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"session","file":"eval code","line":1},"right":{"type":265,"value":"get","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"get('hello') ?>"}}, + "cphalcon:Compiler/ParseTest#25": {"source":"{{ user.session.get('hello') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":46,"left":{"type":265,"value":"user","file":"eval code","line":1},"right":{"type":265,"value":"session","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"get","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"session->get('hello') ?>"}}, + "cphalcon:Compiler/ParseTest#26": {"source":"{{ user.session.get(request.getPost('token')) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":46,"left":{"type":265,"value":"user","file":"eval code","line":1},"right":{"type":265,"value":"session","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"get","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"request","file":"eval code","line":1},"right":{"type":265,"value":"getPost","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"token","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"session->get($request->getPost('token')) ?>"}}, + "cphalcon:Compiler/ParseTest#27": {"source":"{{ a[0]('hello') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#28": {"source":"{{ [a[0]('hello').name]|keys }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":360,"left":[{"expr":{"type":46,"left":{"type":350,"name":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"right":{"type":265,"value":"name","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"right":{"type":265,"value":"keys","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"name]) ?>"}}, + "cphalcon:Compiler/ParseTest#29": {"source":"{{ [1, 2, 3, 4] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"4","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#30": {"source":"{{ [\"hello\", 2, 1.3, false, true, null] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":259,"value":"1.3","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":262,"file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":263,"file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":261,"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#31": {"source":"{{ [\"hello\", 2, 3, false, true, null, [1, 2, \"hola\"]] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":260,"value":"hello","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":262,"file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":263,"file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":261,"file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"hola","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#32": {"source":"{{ ['first': 1, 'second': 2, 'third': 3] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"name":"first","file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"name":"second","file":"eval code","line":1},{"expr":{"type":258,"value":"3","file":"eval code","line":1},"name":"third","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" 1, 'second' => 2, 'third' => 3] ?>"}}, + "cphalcon:Compiler/ParseTest#33": {"source":"{{ ((\"hello\" ~ \"lol\")|e|length)|trim }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":356,"left":{"type":124,"left":{"type":124,"left":{"type":356,"left":{"type":126,"left":{"type":260,"value":"hello","file":"eval code","line":1},"right":{"type":260,"value":"lol","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"e","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"length","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"trim","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"length($this->escaper->html(('hello' . 'lol'))))) ?>"}}, + "cphalcon:Compiler/ParseTest#34": {"source":"{{ \"a\"..\"z\"|join(\",\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":276,"left":{"type":260,"value":"a","file":"eval code","line":1},"right":{"type":124,"left":{"type":260,"value":"z","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"join","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":",","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#35": {"source":"{{ \"My real name is %s\"|format(name) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":260,"value":"My real name is %s","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"format","file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"name","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#36": {"source":"{{ robot.price|default(10.0) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":46,"left":{"type":265,"value":"robot","file":"eval code","line":1},"right":{"type":265,"value":"price","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"default","file":"eval code","line":1},"arguments":[{"expr":{"type":259,"value":"10.0","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"price) ? (10.0) : ($robot->price)) ?>"}}, + "cphalcon:Compiler/ParseTest#37": {"source":"{% if a and b %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":266,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/ParseTest#38": {"source":"{% if a or b %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":267,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/ParseTest#39": {"source":"{% if a is 100 %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":311,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"100","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/ParseTest#40": {"source":"{% if a is not 100 %} hello {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":273,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"100","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" hello "}}, + "cphalcon:Compiler/ParseTest#41": {"source":"{% for a in 1..10 if a < 5 and a > 7 %} hello {% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"a","expr":{"type":276,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"10","file":"eval code","line":1},"file":"eval code","line":1},"if_expr":{"type":266,"left":{"type":60,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"5","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":62,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"7","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" 7) { ?> hello "}}, + "cphalcon:Compiler/ParseTest#42": {"source":"{% for k, v in [1, 2, 3] %} hello {% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"v","key":"k","expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"block_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" $v) { ?> hello "}}, + "cphalcon:Compiler/ParseTest#43": {"source":"{% for k, v in [1, 2, 3] if v is odd %} hello {% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"v","key":"k","expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"if_expr":{"type":388,"left":{"type":265,"value":"v","file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":357,"value":" hello ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" $v) { if (((($v) % 2) != 0)) { ?> hello "}}, + "cphalcon:Compiler/ParseTest#44": {"source":"{% for v in [1, 2, 3] %} {% break %} {% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"v","expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"block_statements":[{"type":357,"value":" ","file":"eval code","line":1},{"type":320,"file":"eval code","line":1},{"type":357,"value":" ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" "}}, + "cphalcon:Compiler/ParseTest#45": {"source":"{% for v in [1, 2] %} {% continue %} {% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"v","expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"block_statements":[{"type":357,"value":" ","file":"eval code","line":1},{"type":319,"file":"eval code","line":1},{"type":357,"value":" ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" "}}, + "cphalcon:Compiler/ParseTest#46": {"source":"{% set a = b %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":61,"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#47": {"source":"{% set a[0] = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#48": {"source":"{% set a[0][1] = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":361,"left":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#49": {"source":"{% set a.y = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"y","file":"eval code","line":1},"file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":"y = 1; ?>"}}, + "cphalcon:Compiler/ParseTest#50": {"source":"{% set a.y.x = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":46,"left":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"y","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"x","file":"eval code","line":1},"file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":"y->x = 1; ?>"}}, + "cphalcon:Compiler/ParseTest#51": {"source":"{% set a[0].y = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":46,"left":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"y","file":"eval code","line":1},"file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":"y = 1; ?>"}}, + "cphalcon:Compiler/ParseTest#52": {"source":"{% set a.y[0] = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":361,"left":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"y","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":"y[0] = 1; ?>"}}, + "cphalcon:Compiler/ParseTest#53": {"source":"{% do 1 %}","parse":{"outcome":"value","value":[{"type":316,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#54": {"source":"{% do a + b %}","parse":{"outcome":"value","value":[{"type":316,"expr":{"type":43,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#55": {"source":"{% do a - 1.2 %}","parse":{"outcome":"value","value":[{"type":316,"expr":{"type":45,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":259,"value":"1.2","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#56": {"source":"{% do 1.2 + 1 * (20 / b) and c %}","parse":{"outcome":"value","value":[{"type":316,"expr":{"type":266,"left":{"type":42,"left":{"type":43,"left":{"type":259,"value":"1.2","file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":356,"left":{"type":47,"left":{"type":258,"value":"20","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#57": {"source":"{% do super()|e %}","parse":{"outcome":"value","value":[{"type":316,"expr":{"type":124,"left":{"type":350,"name":{"type":265,"value":"super","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"e","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"escaper->html(''); ?>"}}, + "cphalcon:Compiler/ParseTest#58": {"source":"{% autoescape true %} {% endautoescape %}","parse":{"outcome":"value","value":[{"type":317,"enable":1,"block_statements":[{"type":357,"value":" ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" "}}, + "cphalcon:Compiler/ParseTest#59": {"source":"{% autoescape false %} {% endautoescape %}","parse":{"outcome":"value","value":[{"type":317,"enable":0,"block_statements":[{"type":357,"value":" ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" "}}, + "cphalcon:Compiler/ParseTest#60": {"source":"{% block hello %} {% endblock %}","parse":{"outcome":"value","value":[{"type":307,"name":"hello","block_statements":[{"type":357,"value":" ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" "}}, + "cphalcon:Compiler/ParseTest#61": {"source":"{% block hello %}{% endblock %}","parse":{"outcome":"value","value":[{"type":307,"name":"hello","file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Compiler/ParseTest#62": {"source":"{% extends \"some/file.volt\" %}","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"some/file.volt","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file some/file.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon:Compiler/ParseTest#63": {"source":"{% include \"some/file.volt\" %}","parse":{"outcome":"value","value":[{"type":313,"path":{"type":260,"value":"some/file.volt","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file some/file.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon:Compiler/ParseTest#64": {"source":"{{ cookie().set('key', 'value') }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":350,"name":{"type":265,"value":"cookie","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"set","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"key","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"value","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('cookie', [])->set('key', 'value') ?>"}}, + "cphalcon:Compiler/ParseTest#65": {"source":"{{ test.is() }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"test","file":"eval code","line":1},"right":{"type":265,"value":"is","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"is() ?>"}}, + "cphalcon:Compiler/ParseTest#66": {"source":"{{ test.is(true) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"test","file":"eval code","line":1},"right":{"type":265,"value":"is","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":263,"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"is(true) ?>"}}, + "cphalcon:Compiler/ParseTest#67": {"source":"{{ cookie().is(true) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":350,"name":{"type":265,"value":"cookie","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"is","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":263,"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('cookie', [])->is(true) ?>"}}, + "cphalcon:Compiler/ParseTest#68": {"source":"{{","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/ParseTest#69": {"source":"{{ }}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/ParseTest#70": {"source":"{{ ++v }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ++ in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ++ in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/ParseTest#71": {"source":"{{\n ++v }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ++ in eval code on line 2","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ++ in eval code on line 2","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/ParseTest#72": {"source":"{{\n\n\n if\n for }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IF in eval code on line 4","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IF in eval code on line 4","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/ParseTest#73": {"source":"{% block some %}\n {% for x in y %}\n {{ .\"hello\".y }}\n {% endfor %}\n {% endblock %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token DOT in eval code on line 3","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token DOT in eval code on line 3","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/ParseTest#74": {"source":"{#\n\n This is a multi-line comment\n\n #}{% block some %}\n {# This is a single-line comment #}\n {% for x in y %}\n {{ \"hello\"++y }}\n {% endfor %}\n {% endblock %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(y) in eval code on line 8","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(y) in eval code on line 8","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/ParseTest#75": {"source":"{# Hello #}\n\n {% for robot in robots %}\n {{ link_to(\"hello\", robot.id ~ ~ robot.name) }}\n {% endfor %}\n\n ","parse":{"outcome":"throw","value":"Syntax error, unexpected token ~ in eval code on line 4","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ~ in eval code on line 4","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Compiler/ParseTest#76": {"source":"'{{ link_to(\"album/\" ~ album.id ~ \"/\" ~ $album.uri, \"\\\"\"\") }}'","parse":{"outcome":"throw","value":"Scanning error before 'album.uri, \" yes "}}, + "cphalcon:Compiler/ResolveTest#2": {"source":"{% if a is even %} yes {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":387,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" yes ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" yes "}}, + "cphalcon:Compiler/ResolveTest#3": {"source":"{% if a is odd %} yes {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":388,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" yes ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" yes "}}, + "cphalcon:Compiler/ResolveTest#4": {"source":"{% if a is numeric %} yes {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":389,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" yes ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" yes "}}, + "cphalcon:Compiler/ResolveTest#5": {"source":"{% if a is defined %} yes {% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":363,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":" yes ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" yes "}}, + "cphalcon:CompilerFilesTest#1": {"source":"{% extends \"","parse":{"outcome":"throw","value":"Scanning error before '' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before '' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:CompilerFilesTest#2": {"source":"\" %}{% block content %}absolute{% endblock %}","parse":{"outcome":"value","value":[{"type":357,"value":"\" %}","file":"eval code","line":1},{"type":307,"name":"content","block_statements":[{"type":357,"value":"absolute","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"\" %}absolute"}}, + "cphalcon:CompilerTest#1": {"source":"{{song}} {{song}}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"song","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":" ","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"song","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" "}}, + "cphalcon:CompilerTest#2": {"source":"Two songs: {{song}} {{song}}","parse":{"outcome":"value","value":[{"type":357,"value":"Two songs: ","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"song","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":" ","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"song","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"Two songs: "}}, + "cphalcon:CompilerTest#3": {"source":"{% for i in 1..5 %}{{ loop.self.index }}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"i","expr":{"type":276,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"5","file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":359,"expr":{"type":46,"left":{"type":46,"left":{"type":265,"value":"loop","file":"eval code","line":1},"right":{"type":265,"value":"self","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"index","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"self = &$v174696563475456749841loop; $v174696563475456749841loop->length = count($v174696563475456749841iterator); $v174696563475456749841loop->index = 1; $v174696563475456749841loop->index0 = 1; $v174696563475456749841loop->revindex = $v174696563475456749841loop->length; $v174696563475456749841loop->revindex0 = $v174696563475456749841loop->length - 1; ?>first = ($v174696563475456749841incr == 0); $v174696563475456749841loop->index = $v174696563475456749841incr + 1; $v174696563475456749841loop->index0 = $v174696563475456749841incr; $v174696563475456749841loop->revindex = $v174696563475456749841loop->length - $v174696563475456749841incr; $v174696563475456749841loop->revindex0 = $v174696563475456749841loop->length - ($v174696563475456749841incr + 1); $v174696563475456749841loop->last = ($v174696563475456749841incr == ($v174696563475456749841loop->length - 1)); ?>self->index ?>"}}, + "cphalcon:Parser/AccessTest#1": {"source":"{{ items[0] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":265,"value":"items","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/AccessTest#2": {"source":"{{ map['key'] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":265,"value":"map","file":"eval code","line":1},"right":{"type":260,"value":"key","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/AccessTest#3": {"source":"{{ items[index] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":265,"value":"items","file":"eval code","line":1},"right":{"type":265,"value":"index","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/AccessTest#4": {"source":"{{ user.name }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":265,"value":"user","file":"eval code","line":1},"right":{"type":265,"value":"name","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"name ?>"}}, + "cphalcon:Parser/AccessTest#5": {"source":"{{ user.address.city }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":46,"left":{"type":265,"value":"user","file":"eval code","line":1},"right":{"type":265,"value":"address","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"city","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"address->city ?>"}}, + "cphalcon:Parser/ArithmeticTest#1": {"source":"{{ 1 + 2 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":43,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ArithmeticTest#2": {"source":"{{ value-- }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":280,"left":{"type":265,"value":"value","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown expression 280 in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltExpression"}}, + "cphalcon:Parser/ArithmeticTest#3": {"source":"{{ 10 / 2 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":47,"left":{"type":258,"value":"10","file":"eval code","line":1},"right":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ArithmeticTest#4": {"source":"{{ value++ }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":279,"left":{"type":265,"value":"value","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown expression 279 in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltExpression"}}, + "cphalcon:Parser/ArithmeticTest#5": {"source":"{{ 10 / / 3 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":37,"left":{"type":258,"value":"10","file":"eval code","line":1},"right":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ArithmeticTest#6": {"source":"{{ 10 % 3 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":37,"left":{"type":258,"value":"10","file":"eval code","line":1},"right":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ArithmeticTest#7": {"source":"{{ 4 * 3 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":42,"left":{"type":258,"value":"4","file":"eval code","line":1},"right":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ArithmeticTest#8": {"source":"{{ 2 * * 8 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":278,"left":{"type":258,"value":"2","file":"eval code","line":1},"right":{"type":258,"value":"8","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ArithmeticTest#9": {"source":"{{ 5 - 3 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":45,"left":{"type":258,"value":"5","file":"eval code","line":1},"right":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ArithmeticTest#10": {"source":"{{ -value }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":368,"right":{"type":265,"value":"value","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ArithmeticTest#11": {"source":"{{ +value }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":369,"right":{"type":265,"value":"value","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ArrayTest#1": {"source":"{{ [] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ArrayTest#2": {"source":"{{ [1, 2, 3] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ArrayTest#3": {"source":"{{ ['a', 'b', 'c'] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":260,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":260,"value":"c","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ArrayTest#4": {"source":"{{ {} }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ArrayTest#5": {"source":"{{ {'key': 'value', 'num': 42} }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":260,"value":"value","file":"eval code","line":1},"name":"key","file":"eval code","line":1},{"expr":{"type":258,"value":"42","file":"eval code","line":1},"name":"num","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" 'value', 'num' => 42] ?>"}}, + "cphalcon:Parser/AutoescapeTest#1": {"source":"{% autoescape false %}{{ html }}{% endautoescape %}","parse":{"outcome":"value","value":[{"type":317,"enable":0,"block_statements":[{"type":359,"expr":{"type":265,"value":"html","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/AutoescapeTest#2": {"source":"{% autoescape true %}{{ name }}{% endautoescape %}","parse":{"outcome":"value","value":[{"type":317,"enable":1,"block_statements":[{"type":359,"expr":{"type":265,"value":"name","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"escaper->html($name) ?>"}}, + "cphalcon:Parser/BlockTest#1": {"source":"{% block sidebar %}{% endblock %}","parse":{"outcome":"value","value":[{"type":307,"name":"sidebar","file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/BlockTest#2": {"source":"{% block content %}Default content{% endblock %}","parse":{"outcome":"value","value":[{"type":307,"name":"content","block_statements":[{"type":357,"value":"Default content","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"Default content"}}, + "cphalcon:Parser/CallTest#1": {"source":"{% call myMacro() %}{% endcall %}","parse":{"outcome":"value","value":[{"type":325,"name":{"type":265,"value":"myMacro","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/CallTest#2": {"source":"{% call render(item) %}block content{% endcall %}","parse":{"outcome":"value","value":[{"type":325,"name":{"type":265,"value":"render","file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"item","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":357,"value":"block content","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/CommentTest#1": {"source":"{# This is a comment #}","parse":{"outcome":"value","value":[]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/CommentTest#2": {"source":"Hello {# greeting comment #} World","parse":{"outcome":"value","value":[{"type":357,"value":"Hello World","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"Hello World"}}, + "cphalcon:Parser/ComparisonTest#1": {"source":"{{ a == b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":272,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ComparisonTest#2": {"source":"{{ a > b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":62,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" $b ?>"}}, + "cphalcon:Parser/ComparisonTest#3": {"source":"{{ a >= b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":271,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"= $b ?>"}}, + "cphalcon:Parser/ComparisonTest#4": {"source":"{{ a === b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":274,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ComparisonTest#5": {"source":"{{ a < b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":60,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ComparisonTest#6": {"source":"{{ a <= b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":270,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ComparisonTest#7": {"source":"{{ a != b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":273,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ComparisonTest#8": {"source":"{{ a <> b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":273,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ComparisonTest#9": {"source":"{{ a !== b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":275,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ConcatenationTest#1": {"source":"{{ 'Hello' ~ ' ' ~ 'World' }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":126,"left":{"type":126,"left":{"type":260,"value":"Hello","file":"eval code","line":1},"right":{"type":260,"value":" ","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":260,"value":"World","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ConcatenationTest#2": {"source":"{{ firstName ~ ' ' ~ lastName }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":126,"left":{"type":126,"left":{"type":265,"value":"firstName","file":"eval code","line":1},"right":{"type":260,"value":" ","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"lastName","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/DoTest#1": {"source":"{% do myFunction() %}","parse":{"outcome":"value","value":[{"type":316,"expr":{"type":350,"name":{"type":265,"value":"myFunction","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('myFunction', []); ?>"}}, + "cphalcon:Parser/DoTest#2": {"source":"{% do object.method(arg) %}","parse":{"outcome":"value","value":[{"type":316,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"object","file":"eval code","line":1},"right":{"type":265,"value":"method","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"arg","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"method($arg); ?>"}}, + "cphalcon:Parser/EchoTest#1": {"source":"{{ 3.14 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":259,"value":"3.14","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/EchoTest#2": {"source":"{{ 42 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":258,"value":"42","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/EchoTest#3": {"source":"{{ \"Hello\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"Hello","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/EchoTest#4": {"source":"{{ \"say \\\"hi\\\"\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"say \\\"hi\\\"","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/EchoTest#5": {"source":"{{ 'Hello' }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"Hello","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/EchoTest#6": {"source":"{{- name -}}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"name","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/EchoTest#7": {"source":"{{- name }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"name","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/EchoTest#8": {"source":"{{ name -}}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"name","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/EchoTest#9": {"source":"{{ name }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"name","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ExtendsTest#1": {"source":"{% extends 'base.volt' %}","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"base.volt","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file base.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon:Parser/ExtendsTest#2": {"source":"{% extends layout %}","parse":{"outcome":"value","value":[{"type":310,"path":{"type":265,"value":"layout","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file layout does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon:Parser/FilterTest#1": {"source":"{{ name | upper }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":265,"value":"name","file":"eval code","line":1},"right":{"type":265,"value":"upper","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/FilterTest#2": {"source":"{{ name | upper | trim }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":124,"left":{"type":265,"value":"name","file":"eval code","line":1},"right":{"type":265,"value":"upper","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"trim","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ForTest#1": {"source":"{% for item in items %}{{ item }}{% elsefor %}No items{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"item","expr":{"type":265,"value":"items","file":"eval code","line":1},"block_statements":[{"type":359,"expr":{"type":265,"value":"item","file":"eval code","line":1},"file":"eval code","line":1},{"type":321,"file":"eval code","line":1},{"type":357,"value":"No items","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"No items"}}, + "cphalcon:Parser/ForTest#2": {"source":"{% for item in items if item.active %}{{ item.name }}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"item","expr":{"type":265,"value":"items","file":"eval code","line":1},"if_expr":{"type":46,"left":{"type":265,"value":"item","file":"eval code","line":1},"right":{"type":265,"value":"active","file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":359,"expr":{"type":46,"left":{"type":265,"value":"item","file":"eval code","line":1},"right":{"type":265,"value":"name","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"active) { ?>name ?>"}}, + "cphalcon:Parser/ForTest#3": {"source":"{% for key, value in map %}{{ key }}: {{ value }}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"value","key":"key","expr":{"type":265,"value":"map","file":"eval code","line":1},"block_statements":[{"type":359,"expr":{"type":265,"value":"key","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":": ","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"value","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" $value) { ?>: "}}, + "cphalcon:Parser/ForTest#4": {"source":"{% for key, value in map if value > 0 %}{{ key }}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"value","key":"key","expr":{"type":265,"value":"map","file":"eval code","line":1},"if_expr":{"type":62,"left":{"type":265,"value":"value","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":359,"expr":{"type":265,"value":"key","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" $value) { if ($value > 0) { ?>"}}, + "cphalcon:Parser/FunctionCallTest#1": {"source":"{{ slice(text, 0, 50) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"slice","file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"text","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"50","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('slice', [$text, 0, 50]) ?>"}}, + "cphalcon:Parser/FunctionCallTest#2": {"source":"{{ myFunc('key': value) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"myFunc","file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"value","file":"eval code","line":1},"name":"key","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('myFunc', ['key' => $value]) ?>"}}, + "cphalcon:Parser/FunctionCallTest#3": {"source":"{{ myFunc() }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"myFunc","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('myFunc', []) ?>"}}, + "cphalcon:Parser/FunctionCallTest#4": {"source":"{{ upper(name) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"upper","file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"name","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('upper', [$name]) ?>"}}, + "cphalcon:Parser/FunctionCallTest#5": {"source":"{{ (1 + 2) * 3 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":42,"left":{"type":356,"left":{"type":43,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IfTest#1": {"source":"{% if active %}Yes{% else %}No{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"active","file":"eval code","line":1},"true_statements":[{"type":357,"value":"Yes","file":"eval code","line":1}],"false_statements":[{"type":357,"value":"No","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"YesNo"}}, + "cphalcon:Parser/IfTest#2": {"source":"{% if status == 1 %}Active{% elseif status == 0 %}Inactive{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":272,"left":{"type":265,"value":"status","file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":"Active","file":"eval code","line":1},{"type":302,"expr":{"type":272,"left":{"type":265,"value":"status","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"Inactive","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"ActiveInactive"}}, + "cphalcon:Parser/IfTest#3": {"source":"{% if status == 1 %}Active{% elseif status == 2 %}Pending{% else %}Unknown{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":272,"left":{"type":265,"value":"status","file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":"Active","file":"eval code","line":1},{"type":302,"expr":{"type":272,"left":{"type":265,"value":"status","file":"eval code","line":1},"right":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"Pending","file":"eval code","line":1}],"false_statements":[{"type":357,"value":"Unknown","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"ActivePendingUnknown"}}, + "cphalcon:Parser/IfTest#4": {"source":"{% if condition %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"condition","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Phalcon\\Mvc\\View\\Engine\\Volt\\Compiler::statementList(): Argument #1 ($statements) must be of type array, null given","exception":"TypeError"}}, + "cphalcon:Parser/IfTest#5": {"source":"{% if active %}Yes{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"active","file":"eval code","line":1},"true_statements":[{"type":357,"value":"Yes","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"Yes"}}, + "cphalcon:Parser/InTest#1": {"source":"{{ item in collection }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":309,"left":{"type":265,"value":"item","file":"eval code","line":1},"right":{"type":265,"value":"collection","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"isIncluded($item, $collection) ?>"}}, + "cphalcon:Parser/InTest#2": {"source":"{{ item not in collection }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":367,"left":{"type":265,"value":"item","file":"eval code","line":1},"right":{"type":265,"value":"collection","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"isIncluded($item, $collection) ?>"}}, + "cphalcon:Parser/IncludeTest#1": {"source":"{% include 'partial.volt' %}","parse":{"outcome":"value","value":[{"type":313,"path":{"type":260,"value":"partial.volt","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file partial.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon:Parser/IncludeTest#2": {"source":"{% include 'partial.volt' with vars %}","parse":{"outcome":"value","value":[{"type":313,"path":{"type":260,"value":"partial.volt","file":"eval code","line":1},"params":{"type":265,"value":"vars","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"partial('partial.volt', $vars); ?>"}}, + "cphalcon:Parser/IncludeTest#3": {"source":"{% include 'partial.volt' with {'key': 'value'} %}","parse":{"outcome":"value","value":[{"type":313,"path":{"type":260,"value":"partial.volt","file":"eval code","line":1},"params":{"type":360,"left":[{"expr":{"type":260,"value":"value","file":"eval code","line":1},"name":"key","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"partial('partial.volt', ['key' => 'value']); ?>"}}, + "cphalcon:Parser/IsTest#1": {"source":"{% if a is b %}c{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":311,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":"c","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"c"}}, + "cphalcon:Parser/IsTest#2": {"source":"{{ var is defined }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":363,"left":{"type":265,"value":"var","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IsTest#3": {"source":"{{ var is empty }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":386,"left":{"type":265,"value":"var","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IsTest#4": {"source":"{{ title is empty ? siteName : title }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":386,"left":{"type":265,"value":"title","file":"eval code","line":1},"file":"eval code","line":1},"left":{"type":265,"value":"siteName","file":"eval code","line":1},"right":{"type":265,"value":"title","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IsTest#5": {"source":"{{ number is even }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":387,"left":{"type":265,"value":"number","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IsTest#6": {"source":"{{ var is iterable }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":391,"left":{"type":265,"value":"var","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IsTest#7": {"source":"{% if a is not b %}c{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":273,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":"c","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"c"}}, + "cphalcon:Parser/IsTest#8": {"source":"{{ var is not defined }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":362,"left":{"type":265,"value":"var","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IsTest#9": {"source":"{{ var is not empty }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":392,"left":{"type":265,"value":"var","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IsTest#10": {"source":"{{ number is not even }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":393,"left":{"type":265,"value":"number","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IsTest#11": {"source":"{{ var is not iterable }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":397,"left":{"type":265,"value":"var","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IsTest#12": {"source":"{{ var is not numeric }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":395,"left":{"type":265,"value":"var","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IsTest#13": {"source":"{{ number is not odd }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":394,"left":{"type":265,"value":"number","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IsTest#14": {"source":"{{ var is not scalar }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":396,"left":{"type":265,"value":"var","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IsTest#15": {"source":"{{ var is numeric }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":389,"left":{"type":265,"value":"var","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IsTest#16": {"source":"{{ number is odd }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":388,"left":{"type":265,"value":"number","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IsTest#17": {"source":"{{ var is scalar }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":390,"left":{"type":265,"value":"var","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/IsTest#18": {"source":"{{ uploadedPhoto is user.avatar ? 'checked=\"checked\"' : '' }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":311,"left":{"type":265,"value":"uploadedPhoto","file":"eval code","line":1},"right":{"type":46,"left":{"type":265,"value":"user","file":"eval code","line":1},"right":{"type":265,"value":"avatar","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"left":{"type":260,"value":"checked=\"checked\"","file":"eval code","line":1},"right":{"type":260,"value":"","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"avatar ? 'checked=\"checked\"' : '') ?>"}}, + "cphalcon:Parser/LogicalTest#1": {"source":"{{ a and b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":266,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/LogicalTest#2": {"source":"{{ a or b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":267,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/LoopControlTest#1": {"source":"{% for item in items %}{% if item.skip %}{% break %}{% endif %}{{ item }}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"item","expr":{"type":265,"value":"items","file":"eval code","line":1},"block_statements":[{"type":300,"expr":{"type":46,"left":{"type":265,"value":"item","file":"eval code","line":1},"right":{"type":265,"value":"skip","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":320,"file":"eval code","line":1}],"file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"item","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"skip) { ?>"}}, + "cphalcon:Parser/LoopControlTest#2": {"source":"{% for item in items %}{% if item.skip %}{% continue %}{% endif %}{{ item }}{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"item","expr":{"type":265,"value":"items","file":"eval code","line":1},"block_statements":[{"type":300,"expr":{"type":46,"left":{"type":265,"value":"item","file":"eval code","line":1},"right":{"type":265,"value":"skip","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":319,"file":"eval code","line":1}],"file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"item","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"skip) { ?>"}}, + "cphalcon:Parser/MacroTest#1": {"source":"{% macro show(visible = false) %}{{ visible }}{% endmacro %}","parse":{"outcome":"value","value":[{"type":322,"name":"show","parameters":[{"variable":"visible","default":{"type":262,"file":"eval code","line":1},"file":"eval code","line":1}],"block_statements":[{"type":359,"expr":{"type":265,"value":"visible","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"macros['show'] = function($__p = null) { if (isset($__p[0])) { $visible = $__p[0]; } else { if (array_key_exists(\"visible\", $__p)) { $visible = $__p[\"visible\"]; } else { $visible = false; } } ?>macros['show'] = \\Closure::bind($this->macros['show'], $this); ?>"}}, + "cphalcon:Parser/MacroTest#2": {"source":"{% macro repeat(times = 1) %}{{ times }}{% endmacro %}","parse":{"outcome":"value","value":[{"type":322,"name":"repeat","parameters":[{"variable":"times","default":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"block_statements":[{"type":359,"expr":{"type":265,"value":"times","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"macros['repeat'] = function($__p = null) { if (isset($__p[0])) { $times = $__p[0]; } else { if (array_key_exists(\"times\", $__p)) { $times = $__p[\"times\"]; } else { $times = 1; } } ?>macros['repeat'] = \\Closure::bind($this->macros['repeat'], $this); ?>"}}, + "cphalcon:Parser/MacroTest#3": {"source":"{% macro render(item = null) %}{{ item }}{% endmacro %}","parse":{"outcome":"value","value":[{"type":322,"name":"render","parameters":[{"variable":"item","default":{"type":261,"file":"eval code","line":1},"file":"eval code","line":1}],"block_statements":[{"type":359,"expr":{"type":265,"value":"item","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"macros['render'] = function($__p = null) { if (isset($__p[0])) { $item = $__p[0]; } else { if (array_key_exists(\"item\", $__p)) { $item = $__p[\"item\"]; } else { $item = null; } } ?>macros['render'] = \\Closure::bind($this->macros['render'], $this); ?>"}}, + "cphalcon:Parser/MacroTest#4": {"source":"{% macro greet(name = 'World') %}Hello {{ name }}{% endmacro %}","parse":{"outcome":"value","value":[{"type":322,"name":"greet","parameters":[{"variable":"name","default":{"type":260,"value":"World","file":"eval code","line":1},"file":"eval code","line":1}],"block_statements":[{"type":357,"value":"Hello ","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"name","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"macros['greet'] = function($__p = null) { if (isset($__p[0])) { $name = $__p[0]; } else { if (array_key_exists(\"name\", $__p)) { $name = $__p[\"name\"]; } else { $name = 'World'; } } ?>Hello macros['greet'] = \\Closure::bind($this->macros['greet'], $this); ?>"}}, + "cphalcon:Parser/MacroTest#5": {"source":"{% macro show(visible = true) %}{{ visible }}{% endmacro %}","parse":{"outcome":"value","value":[{"type":322,"name":"show","parameters":[{"variable":"visible","default":{"type":263,"file":"eval code","line":1},"file":"eval code","line":1}],"block_statements":[{"type":359,"expr":{"type":265,"value":"visible","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"macros['show'] = function($__p = null) { if (isset($__p[0])) { $visible = $__p[0]; } else { if (array_key_exists(\"visible\", $__p)) { $visible = $__p[\"visible\"]; } else { $visible = true; } } ?>macros['show'] = \\Closure::bind($this->macros['show'], $this); ?>"}}, + "cphalcon:Parser/MacroTest#6": {"source":"{% macro input(name, value) %}{% endmacro %}","parse":{"outcome":"value","value":[{"type":322,"name":"input","parameters":[{"variable":"name","file":"eval code","line":1},{"variable":"value","file":"eval code","line":1}],"block_statements":[{"type":357,"value":"","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"macros['input'] = function($__p = null) { if (isset($__p[0])) { $name = $__p[0]; } else { if (array_key_exists(\"name\", $__p)) { $name = $__p[\"name\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'input' was called without parameter: name\"); } } if (isset($__p[1])) { $value = $__p[1]; } else { if (array_key_exists(\"value\", $__p)) { $value = $__p[\"value\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'input' was called without parameter: value\"); } } ?>\" value=\"\">macros['input'] = \\Closure::bind($this->macros['input'], $this); ?>"}}, + "cphalcon:Parser/MacroTest#7": {"source":"{% macro myMacro() %}content{% endmacro %}","parse":{"outcome":"value","value":[{"type":322,"name":"myMacro","block_statements":[{"type":357,"value":"content","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"macros['myMacro'] = function() { ?>contentmacros['myMacro'] = \\Closure::bind($this->macros['myMacro'], $this); ?>"}}, + "cphalcon:Parser/MacroTest#8": {"source":"{% macro greet(name) %}Hello {{ name }}{% endmacro %}","parse":{"outcome":"value","value":[{"type":322,"name":"greet","parameters":[{"variable":"name","file":"eval code","line":1}],"block_statements":[{"type":357,"value":"Hello ","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"name","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"macros['greet'] = function($__p = null) { if (isset($__p[0])) { $name = $__p[0]; } else { if (array_key_exists(\"name\", $__p)) { $name = $__p[\"name\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'greet' was called without parameter: name\"); } } ?>Hello macros['greet'] = \\Closure::bind($this->macros['greet'], $this); ?>"}}, + "cphalcon:Parser/RangeTest#1": {"source":"{{ 1..10 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":276,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"10","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/RangeTest#2": {"source":"{{ start..end }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":276,"left":{"type":265,"value":"start","file":"eval code","line":1},"right":{"type":265,"value":"end","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ReturnTest#1": {"source":"{% return value %}","parse":{"outcome":"value","value":[{"type":327,"expr":{"type":265,"value":"value","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/ReturnTest#2": {"source":"{% return a + b %}","parse":{"outcome":"value","value":[{"type":327,"expr":{"type":43,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/SetTest#1": {"source":"{% set counter += 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"counter","file":"eval code","line":1},"op":281,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/SetTest#2": {"source":"{% set items[0] = 'first' %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":361,"left":{"type":265,"value":"items","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"op":61,"expr":{"type":260,"value":"first","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/SetTest#3": {"source":"{% set name = 'John' %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"name","file":"eval code","line":1},"op":61,"expr":{"type":260,"value":"John","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/SetTest#4": {"source":"{% set total = price * qty %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"total","file":"eval code","line":1},"op":61,"expr":{"type":42,"left":{"type":265,"value":"price","file":"eval code","line":1},"right":{"type":265,"value":"qty","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/SetTest#5": {"source":"{% set value /= 2 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"value","file":"eval code","line":1},"op":284,"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/SetTest#6": {"source":"{% set user.name = 'John' %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":46,"left":{"type":265,"value":"user","file":"eval code","line":1},"right":{"type":265,"value":"name","file":"eval code","line":1},"file":"eval code","line":1},"op":61,"expr":{"type":260,"value":"John","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":"name = 'John'; ?>"}}, + "cphalcon:Parser/SetTest#7": {"source":"{% set myVar = someVar is defined ? 'yes' : 'no' %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"myVar","file":"eval code","line":1},"op":61,"expr":{"type":366,"ternary":{"type":363,"left":{"type":265,"value":"someVar","file":"eval code","line":1},"file":"eval code","line":1},"left":{"type":260,"value":"yes","file":"eval code","line":1},"right":{"type":260,"value":"no","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/SetTest#8": {"source":"{% set value *= 2 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"value","file":"eval code","line":1},"op":283,"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/SetTest#9": {"source":"{% set a = 1, b = 2, c = 3 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"variable":{"type":265,"value":"b","file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"variable":{"type":265,"value":"c","file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/SetTest#10": {"source":"{% set counter -= 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"counter","file":"eval code","line":1},"op":282,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/SetTest#11": {"source":"{%- set defaultClass = 'form-control ' -%}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"defaultClass","file":"eval code","line":1},"op":61,"expr":{"type":260,"value":"form-control ","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/SliceTest#1": {"source":"{{ items[1:3] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":365,"left":{"type":265,"value":"items","file":"eval code","line":1},"start":{"type":258,"value":"1","file":"eval code","line":1},"end":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"slice($items, 1, 3) ?>"}}, + "cphalcon:Parser/SliceTest#2": {"source":"{{ items[2:] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":365,"left":{"type":265,"value":"items","file":"eval code","line":1},"start":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"slice($items, 2, null) ?>"}}, + "cphalcon:Parser/SliceTest#3": {"source":"{{ items[:4] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":365,"left":{"type":265,"value":"items","file":"eval code","line":1},"end":{"type":258,"value":"4","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"slice($items, null, 4) ?>"}}, + "cphalcon:Parser/StackOverflowTest#1": {"source":"{{ ","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Parser/SwitchTest#1": {"source":"{% switch foo %}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is a 'switch' block without 'endswitch'","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code, there is a 'switch' block without 'endswitch'","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Parser/SwitchTest#2": {"source":"{% case foo %}","parse":{"outcome":"throw","value":"Unexpected CASE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Unexpected CASE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Parser/SwitchTest#3": {"source":"{% default %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token DEFAULT(default) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token DEFAULT(default) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Parser/SwitchTest#4": {"source":"{% switch foo %}\n {% switch %}\n {% endswitch %}\n{% endswitch %}","parse":{"outcome":"throw","value":"A nested switch detected. There is no nested switch-case statements support in eval code on line 2","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"A nested switch detected. There is no nested switch-case statements support in eval code on line 2","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Parser/SwitchTest#5": {"source":"{% switch %}\n {% case foo %}\n {% break %}\n{% endswitch %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token %} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:Parser/SwitchTest#6": {"source":"{% switch status %}{% case 1 %}Active{% case 2 %}Pending{% default %}Unknown{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"status","file":"eval code","line":1},"case_clauses":[{"type":412,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"Active","file":"eval code","line":1},{"type":412,"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"Pending","file":"eval code","line":1},{"type":413,"file":"eval code","line":1},{"type":357,"value":"Unknown","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"ActivePendingUnknown"}}, + "cphalcon:Parser/SwitchTest#7": {"source":"{% switch x %}{% case 1 %}{{ false|default('simple text') }}{% break %}{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"x","file":"eval code","line":1},"case_clauses":[{"type":412,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"type":359,"expr":{"type":124,"left":{"type":262,"file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"default","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"simple text","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},{"type":320,"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/SwitchTest#8": {"source":"{% switch x %}{% default %}{{ value|default('unknown') }}{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"x","file":"eval code","line":1},"case_clauses":[{"type":413,"file":"eval code","line":1},{"type":359,"expr":{"type":124,"left":{"type":265,"value":"value","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"default","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"unknown","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/SwitchTest#9": {"source":"{% switch status %}{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"status","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/SwitchTest#10": {"source":"{% switch foo%} {% case foo %} {% endswitch%}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"foo","file":"eval code","line":1},"case_clauses":[{"type":357,"value":" ","file":"eval code","line":1},{"type":412,"expr":{"type":265,"value":"foo","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":" ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/SwitchTest#11": {"source":"{% switch foo%} {% case foo %} {% default %} {% endswitch%}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"foo","file":"eval code","line":1},"case_clauses":[{"type":357,"value":" ","file":"eval code","line":1},{"type":412,"expr":{"type":265,"value":"foo","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":" ","file":"eval code","line":1},{"type":413,"file":"eval code","line":1},{"type":357,"value":" ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" "}}, + "cphalcon:Parser/SwitchTest#12": {"source":"{% switch username %}\n {% case \"Jim\" %}\n Hello username\n {% case \"Nik\" %}\n {{ username }}!\n {% break %}\n {% default %}\n Who are you?\n{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"username","file":"eval code","line":1},"case_clauses":[{"type":357,"value":"\n ","file":"eval code","line":2},{"type":412,"expr":{"type":260,"value":"Jim","file":"eval code","line":2},"file":"eval code","line":4},{"type":357,"value":"\n Hello username\n ","file":"eval code","line":4},{"type":412,"expr":{"type":260,"value":"Nik","file":"eval code","line":4},"file":"eval code","line":5},{"type":357,"value":"\n ","file":"eval code","line":5},{"type":359,"expr":{"type":265,"value":"username","file":"eval code","line":5},"file":"eval code","line":6},{"type":357,"value":"!\n ","file":"eval code","line":6},{"type":320,"file":"eval code","line":7},{"type":357,"value":"\n ","file":"eval code","line":7},{"type":413,"file":"eval code","line":9},{"type":357,"value":"\n Who are you?\n","file":"eval code","line":9}],"file":"eval code","line":9}]},"compile":{"outcome":"value","value":"\n\nHello username\n\n!\n\n\nWho are you?\n"}}, + "cphalcon:Parser/TernaryTest#1": {"source":"{{ condition ? 'yes' : 'no' }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":265,"value":"condition","file":"eval code","line":1},"left":{"type":260,"value":"yes","file":"eval code","line":1},"right":{"type":260,"value":"no","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/TernaryTest#2": {"source":"{{ someVar is defined ? 'yes' : 'no' }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":363,"left":{"type":265,"value":"someVar","file":"eval code","line":1},"file":"eval code","line":1},"left":{"type":260,"value":"yes","file":"eval code","line":1},"right":{"type":260,"value":"no","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:Parser/TernaryTest#3": {"source":"{{ active ? activeLabel : inactiveLabel }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":265,"value":"active","file":"eval code","line":1},"left":{"type":265,"value":"activeLabel","file":"eval code","line":1},"right":{"type":265,"value":"inactiveLabel","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:VerbatimTest#1": {"source":"{% verbatim %}{{ foo }}{% endverbatim %}","parse":{"outcome":"value","value":[{"type":357,"value":"{{ foo }}","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"{{ foo }}"}}, + "cphalcon:VerbatimTest#2": {"source":"{{ foo }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"foo","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon:VerbatimTest#3": {"source":"{% verbatim %}{% if x %}literal{% endif %}{% endverbatim %}","parse":{"outcome":"value","value":[{"type":357,"value":"{% if x %}literal{% endif %}","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"{% if x %}literal{% endif %}"}}, + "cphalcon:VerbatimTest#4": {"source":"{% if x %}literal{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"x","file":"eval code","line":1},"true_statements":[{"type":357,"value":"literal","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"literal"}}, + "cphalcon:VerbatimTest#5": {"source":"{% verbatim %}{# not a comment #}{% endverbatim %}","parse":{"outcome":"value","value":[{"type":357,"value":"{# not a comment #}","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"{# not a comment #}"}}, + "cphalcon:VerbatimTest#6": {"source":"{# not a comment #}","parse":{"outcome":"value","value":[]},"compile":{"outcome":"value","value":""}}, + "cphalcon:VerbatimTest#7": {"source":"{% verbatim %}{{ keep {{ }} }}{% endverbatim %}","parse":{"outcome":"value","value":[{"type":357,"value":"{{ keep {{ }} }}","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"{{ keep {{ }} }}"}}, + "cphalcon:VerbatimTest#8": {"source":"{{ keep {{ }} }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token < in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token < in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "cphalcon:VerbatimTest#9": {"source":"a {{ \"b\" }} {% verbatim %}{{ c }}{% endverbatim %} d","parse":{"outcome":"value","value":[{"type":357,"value":"a ","file":"eval code","line":1},{"type":359,"expr":{"type":260,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":" ","file":"eval code","line":1},{"type":357,"value":"{{ c }}","file":"eval code","line":1},{"type":357,"value":" d","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"a {{ c }} d"}}, + "cphalcon:VerbatimTest#10": {"source":"{% verbatim %}{% endverbatim %}","parse":{"outcome":"value","value":[{"type":357,"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon-views:blocks/base.volt": {"source":"\n\n\n \n \n\n\n{% block header %}\n{{ partial('blocks/partials/header') }}\n{% endblock %}\n\n{% block mainContent %}{% endblock %}\n\n\n\n","parse":{"outcome":"value","value":[{"type":357,"value":"\n\n\n \n \n\n\n","file":"eval code","line":8},{"type":307,"name":"header","block_statements":[{"type":357,"value":"\n","file":"eval code","line":9},{"type":359,"expr":{"type":350,"name":{"type":265,"value":"partial","file":"eval code","line":9},"arguments":[{"expr":{"type":260,"value":"blocks/partials/header","file":"eval code","line":9},"file":"eval code","line":9}],"file":"eval code","line":9},"file":"eval code","line":10},{"type":357,"value":"\n","file":"eval code","line":10}],"file":"eval code","line":12},{"type":357,"value":"\n\n","file":"eval code","line":12},{"type":307,"name":"mainContent","file":"eval code","line":16},{"type":357,"value":"\n\n\n\n","file":"eval code","line":16}]},"compile":{"outcome":"value","value":"\n\n\n \n \n\n\n\npartial('blocks/partials/header') ?>\n\n\n\n\n\n\n"}}, + "cphalcon-views:blocks/index/login.volt": {"source":"{% extends 'base.volt' %}\n\n{% block header %}{% endblock %}\n{% block mainContent %}\n

This is the login page

\n{% endblock %}\n{% block footer %}{% endblock %}\n","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"base.volt","file":"eval code","line":1},"file":"eval code","line":3},{"type":307,"name":"header","file":"eval code","line":4},{"type":307,"name":"mainContent","block_statements":[{"type":357,"value":"\n

This is the login page

\n","file":"eval code","line":6}],"file":"eval code","line":7},{"type":307,"name":"footer","file":"eval code","line":8}]},"compile":{"outcome":"throw","value":"Template file base.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:blocks/index/main.volt": {"source":"{% extends 'base.volt' %}\n\n{% block mainContent %}\n

This is the main page

\n{% endblock %}\n","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"base.volt","file":"eval code","line":1},"file":"eval code","line":3},{"type":307,"name":"mainContent","block_statements":[{"type":357,"value":"\n

This is the main page

\n","file":"eval code","line":5}],"file":"eval code","line":6}]},"compile":{"outcome":"throw","value":"Template file base.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:builtinfunction/index.volt": {"source":"Length Array: {{ arr|length }}\nLength Object: {{ obj|length }}\nLength String: {{ str|length }}\nLength No String: {{ no_str|length }}\nSlice Array: {{ arr[0:]|join(',') }}\nSlice Array: {{ arr[1:2]|join(',') }}\nSlice Array: {{ arr[0:2]|join(',') }}\nSlice Object: {{ obj[1:]|join(',') }}\nSlice Object: {{ obj[1:2]|join(',') }}\nSlice Object: {{ obj[0:1]|join(',') }}\nSlice String: {{ \"hello\"[0:2] }}\nSlice String: {{ \"hello\"[1:2] }}\nSlice String: {{ \"hello\"[2:] }}\nSlice No String: {{ 1234[0:2] }}\nSlice No String: {{ 1234[1:2] }}\nSlice No String: {{ 1234[2:] }}\n","parse":{"outcome":"value","value":[{"type":357,"value":"Length Array: ","file":"eval code","line":1},{"type":359,"expr":{"type":124,"left":{"type":265,"value":"arr","file":"eval code","line":1},"right":{"type":265,"value":"length","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":2},{"type":357,"value":"\nLength Object: ","file":"eval code","line":2},{"type":359,"expr":{"type":124,"left":{"type":265,"value":"obj","file":"eval code","line":2},"right":{"type":265,"value":"length","file":"eval code","line":2},"file":"eval code","line":2},"file":"eval code","line":3},{"type":357,"value":"\nLength String: ","file":"eval code","line":3},{"type":359,"expr":{"type":124,"left":{"type":265,"value":"str","file":"eval code","line":3},"right":{"type":265,"value":"length","file":"eval code","line":3},"file":"eval code","line":3},"file":"eval code","line":4},{"type":357,"value":"\nLength No String: ","file":"eval code","line":4},{"type":359,"expr":{"type":124,"left":{"type":265,"value":"no_str","file":"eval code","line":4},"right":{"type":265,"value":"length","file":"eval code","line":4},"file":"eval code","line":4},"file":"eval code","line":5},{"type":357,"value":"\nSlice Array: ","file":"eval code","line":5},{"type":359,"expr":{"type":124,"left":{"type":365,"left":{"type":265,"value":"arr","file":"eval code","line":5},"start":{"type":258,"value":"0","file":"eval code","line":5},"file":"eval code","line":5},"right":{"type":350,"name":{"type":265,"value":"join","file":"eval code","line":5},"arguments":[{"expr":{"type":260,"value":",","file":"eval code","line":5},"file":"eval code","line":5}],"file":"eval code","line":5},"file":"eval code","line":5},"file":"eval code","line":6},{"type":357,"value":"\nSlice Array: ","file":"eval code","line":6},{"type":359,"expr":{"type":124,"left":{"type":365,"left":{"type":265,"value":"arr","file":"eval code","line":6},"start":{"type":258,"value":"1","file":"eval code","line":6},"end":{"type":258,"value":"2","file":"eval code","line":6},"file":"eval code","line":6},"right":{"type":350,"name":{"type":265,"value":"join","file":"eval code","line":6},"arguments":[{"expr":{"type":260,"value":",","file":"eval code","line":6},"file":"eval code","line":6}],"file":"eval code","line":6},"file":"eval code","line":6},"file":"eval code","line":7},{"type":357,"value":"\nSlice Array: ","file":"eval code","line":7},{"type":359,"expr":{"type":124,"left":{"type":365,"left":{"type":265,"value":"arr","file":"eval code","line":7},"start":{"type":258,"value":"0","file":"eval code","line":7},"end":{"type":258,"value":"2","file":"eval code","line":7},"file":"eval code","line":7},"right":{"type":350,"name":{"type":265,"value":"join","file":"eval code","line":7},"arguments":[{"expr":{"type":260,"value":",","file":"eval code","line":7},"file":"eval code","line":7}],"file":"eval code","line":7},"file":"eval code","line":7},"file":"eval code","line":8},{"type":357,"value":"\nSlice Object: ","file":"eval code","line":8},{"type":359,"expr":{"type":124,"left":{"type":365,"left":{"type":265,"value":"obj","file":"eval code","line":8},"start":{"type":258,"value":"1","file":"eval code","line":8},"file":"eval code","line":8},"right":{"type":350,"name":{"type":265,"value":"join","file":"eval code","line":8},"arguments":[{"expr":{"type":260,"value":",","file":"eval code","line":8},"file":"eval code","line":8}],"file":"eval code","line":8},"file":"eval code","line":8},"file":"eval code","line":9},{"type":357,"value":"\nSlice Object: ","file":"eval code","line":9},{"type":359,"expr":{"type":124,"left":{"type":365,"left":{"type":265,"value":"obj","file":"eval code","line":9},"start":{"type":258,"value":"1","file":"eval code","line":9},"end":{"type":258,"value":"2","file":"eval code","line":9},"file":"eval code","line":9},"right":{"type":350,"name":{"type":265,"value":"join","file":"eval code","line":9},"arguments":[{"expr":{"type":260,"value":",","file":"eval code","line":9},"file":"eval code","line":9}],"file":"eval code","line":9},"file":"eval code","line":9},"file":"eval code","line":10},{"type":357,"value":"\nSlice Object: ","file":"eval code","line":10},{"type":359,"expr":{"type":124,"left":{"type":365,"left":{"type":265,"value":"obj","file":"eval code","line":10},"start":{"type":258,"value":"0","file":"eval code","line":10},"end":{"type":258,"value":"1","file":"eval code","line":10},"file":"eval code","line":10},"right":{"type":350,"name":{"type":265,"value":"join","file":"eval code","line":10},"arguments":[{"expr":{"type":260,"value":",","file":"eval code","line":10},"file":"eval code","line":10}],"file":"eval code","line":10},"file":"eval code","line":10},"file":"eval code","line":11},{"type":357,"value":"\nSlice String: ","file":"eval code","line":11},{"type":359,"expr":{"type":365,"left":{"type":260,"value":"hello","file":"eval code","line":11},"start":{"type":258,"value":"0","file":"eval code","line":11},"end":{"type":258,"value":"2","file":"eval code","line":11},"file":"eval code","line":11},"file":"eval code","line":12},{"type":357,"value":"\nSlice String: ","file":"eval code","line":12},{"type":359,"expr":{"type":365,"left":{"type":260,"value":"hello","file":"eval code","line":12},"start":{"type":258,"value":"1","file":"eval code","line":12},"end":{"type":258,"value":"2","file":"eval code","line":12},"file":"eval code","line":12},"file":"eval code","line":13},{"type":357,"value":"\nSlice String: ","file":"eval code","line":13},{"type":359,"expr":{"type":365,"left":{"type":260,"value":"hello","file":"eval code","line":13},"start":{"type":258,"value":"2","file":"eval code","line":13},"file":"eval code","line":13},"file":"eval code","line":14},{"type":357,"value":"\nSlice No String: ","file":"eval code","line":14},{"type":359,"expr":{"type":365,"left":{"type":258,"value":"1234","file":"eval code","line":14},"start":{"type":258,"value":"0","file":"eval code","line":14},"end":{"type":258,"value":"2","file":"eval code","line":14},"file":"eval code","line":14},"file":"eval code","line":15},{"type":357,"value":"\nSlice No String: ","file":"eval code","line":15},{"type":359,"expr":{"type":365,"left":{"type":258,"value":"1234","file":"eval code","line":15},"start":{"type":258,"value":"1","file":"eval code","line":15},"end":{"type":258,"value":"2","file":"eval code","line":15},"file":"eval code","line":15},"file":"eval code","line":16},{"type":357,"value":"\nSlice No String: ","file":"eval code","line":16},{"type":359,"expr":{"type":365,"left":{"type":258,"value":"1234","file":"eval code","line":16},"start":{"type":258,"value":"2","file":"eval code","line":16},"file":"eval code","line":16},"file":"eval code","line":17},{"type":357,"value":"\n","file":"eval code","line":17}]},"compile":{"outcome":"value","value":"Length Array: length($arr) ?>\nLength Object: length($obj) ?>\nLength String: length($str) ?>\nLength No String: length($no_str) ?>\nSlice Array: slice($arr, 0, null)) ?>\nSlice Array: slice($arr, 1, 2)) ?>\nSlice Array: slice($arr, 0, 2)) ?>\nSlice Object: slice($obj, 1, null)) ?>\nSlice Object: slice($obj, 1, 2)) ?>\nSlice Object: slice($obj, 0, 1)) ?>\nSlice String: slice('hello', 0, 2) ?>\nSlice String: slice('hello', 1, 2) ?>\nSlice String: slice('hello', 2, null) ?>\nSlice No String: slice(1234, 0, 2) ?>\nSlice No String: slice(1234, 1, 2) ?>\nSlice No String: slice(1234, 2, null) ?>\n"}}, + "cphalcon-views:compiler/children.extends.volt": {"source":"{% extends \"compiler/parent.volt\" %}\n\n{% block title %}Index{% endblock %}\n\n{% block head %}{% endblock %}\n\n{% block content %}

Index

Welcome on my awesome homepage.

{% endblock %}\n","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"compiler/parent.volt","file":"eval code","line":1},"file":"eval code","line":3},{"type":307,"name":"title","block_statements":[{"type":357,"value":"Index","file":"eval code","line":3}],"file":"eval code","line":5},{"type":307,"name":"head","block_statements":[{"type":357,"value":"","file":"eval code","line":5}],"file":"eval code","line":7},{"type":307,"name":"content","block_statements":[{"type":357,"value":"

Index

Welcome on my awesome homepage.

","file":"eval code","line":7}],"file":"eval code","line":8}]},"compile":{"outcome":"throw","value":"Template file compiler/parent.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:compiler/children.volt": {"source":"{% extends \"tests/support/assets/views/compiler/parent.volt\" %}\n\n{% block title %}Index{% endblock %}\n\n{% block head %}{% endblock %}\n\n{% block content %}

Index

Welcome on my awesome homepage.

{% endblock %}\n","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"tests/support/assets/views/compiler/parent.volt","file":"eval code","line":1},"file":"eval code","line":3},{"type":307,"name":"title","block_statements":[{"type":357,"value":"Index","file":"eval code","line":3}],"file":"eval code","line":5},{"type":307,"name":"head","block_statements":[{"type":357,"value":"","file":"eval code","line":5}],"file":"eval code","line":7},{"type":307,"name":"content","block_statements":[{"type":357,"value":"

Index

Welcome on my awesome homepage.

","file":"eval code","line":7}],"file":"eval code","line":8}]},"compile":{"outcome":"throw","value":"Template file tests/support/assets/views/compiler/parent.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:compiler/children2.volt": {"source":"{% extends \"tests/support/assets/views/compiler/parent.volt\" %}\n\n{% block title %}Index{% endblock %}\n\n{% block head %} {{ super() }} {% endblock %}\n\n{% block content %}

Index

Welcome to my awesome homepage.

{% endblock %}\n\n{% block footer %}{{ super() }}{% endblock %}\n","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"tests/support/assets/views/compiler/parent.volt","file":"eval code","line":1},"file":"eval code","line":3},{"type":307,"name":"title","block_statements":[{"type":357,"value":"Index","file":"eval code","line":3}],"file":"eval code","line":5},{"type":307,"name":"head","block_statements":[{"type":357,"value":" ","file":"eval code","line":5},{"type":359,"expr":{"type":350,"name":{"type":265,"value":"super","file":"eval code","line":5},"file":"eval code","line":5},"file":"eval code","line":5},{"type":357,"value":" ","file":"eval code","line":5}],"file":"eval code","line":7},{"type":307,"name":"content","block_statements":[{"type":357,"value":"

Index

Welcome to my awesome homepage.

","file":"eval code","line":7}],"file":"eval code","line":9},{"type":307,"name":"footer","block_statements":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"super","file":"eval code","line":9},"file":"eval code","line":9},"file":"eval code","line":9}],"file":"eval code","line":10}]},"compile":{"outcome":"throw","value":"Template file tests/support/assets/views/compiler/parent.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:compiler/import.volt": {"source":"
{% include \"partials/header.volt\" %}
{% include \"partials/footer.volt\" %}
","parse":{"outcome":"value","value":[{"type":357,"value":"
","file":"eval code","line":1},{"type":313,"path":{"type":260,"value":"partials/header.volt","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"
","file":"eval code","line":1},{"type":313,"path":{"type":260,"value":"partials/footer.volt","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"
","file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file partials/header.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:compiler/import2.volt": {"source":"
{% include \"partials/header2.volt\" %}
","parse":{"outcome":"value","value":[{"type":357,"value":"
","file":"eval code","line":1},{"type":313,"path":{"type":260,"value":"partials/header2.volt","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"
","file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file partials/header2.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:compiler/index.volt": {"source":"Hello {{ song }}!","parse":{"outcome":"value","value":[{"type":357,"value":"Hello ","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"song","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"!","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"Hello !"}}, + "cphalcon-views:compiler/parent.volt": {"source":"{% block head %}{% endblock %}{% block title %}{% endblock %} - My Webpage
{% block content %}{% endblock %}
{% block footer %}© Copyright 2012 by you.{% endblock %}
","parse":{"outcome":"value","value":[{"type":357,"value":"","file":"eval code","line":1},{"type":307,"name":"head","block_statements":[{"type":357,"value":"","file":"eval code","line":1}],"file":"eval code","line":1},{"type":357,"value":"","file":"eval code","line":1},{"type":307,"name":"title","file":"eval code","line":1},{"type":357,"value":" - My Webpage
","file":"eval code","line":1},{"type":307,"name":"content","file":"eval code","line":1},{"type":357,"value":"
","file":"eval code","line":1},{"type":307,"name":"footer","block_statements":[{"type":357,"value":"© Copyright 2012 by you.","file":"eval code","line":1}],"file":"eval code","line":1},{"type":357,"value":"
","file":"eval code","line":1}]},"compile":{"outcome":"value","value":" - My Webpage
© Copyright 2012 by you.
"}}, + "cphalcon-views:compiler/partial.volt": {"source":"Some label: {{ some_var }}","parse":{"outcome":"value","value":[{"type":357,"value":"Some label: ","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"some_var","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"Some label: "}}, + "cphalcon-views:currentrender/subobject.volt": {"source":"{{ parentObject.child.getValue() }}\n","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":46,"left":{"type":265,"value":"parentObject","file":"eval code","line":1},"right":{"type":265,"value":"child","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"getValue","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":2},{"type":357,"value":"\n","file":"eval code","line":2}]},"compile":{"outcome":"value","value":"child->getValue() ?>\n"}}, + "cphalcon-views:extends/children.extends.volt": {"source":"{% extends \"extends/parent.volt\" %}\n\n{% block title %}Index{% endblock %}\n\n{% block head %}{% endblock %}\n\n{% block content %}

Index

Welcome on my awesome homepage.

{% endblock %}\n","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"extends/parent.volt","file":"eval code","line":1},"file":"eval code","line":3},{"type":307,"name":"title","block_statements":[{"type":357,"value":"Index","file":"eval code","line":3}],"file":"eval code","line":5},{"type":307,"name":"head","block_statements":[{"type":357,"value":"","file":"eval code","line":5}],"file":"eval code","line":7},{"type":307,"name":"content","block_statements":[{"type":357,"value":"

Index

Welcome on my awesome homepage.

","file":"eval code","line":7}],"file":"eval code","line":8}]},"compile":{"outcome":"throw","value":"Template file extends/parent.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:extends/children.volt": {"source":"{% extends \"tests/support/assets/views/extends/parent.volt\" %}\n\n{% block title %}Index{% endblock %}\n\n{% block head %}{% endblock %}\n\n{% block content %}

Index

Welcome on my awesome homepage.

{% endblock %}\n","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"tests/support/assets/views/extends/parent.volt","file":"eval code","line":1},"file":"eval code","line":3},{"type":307,"name":"title","block_statements":[{"type":357,"value":"Index","file":"eval code","line":3}],"file":"eval code","line":5},{"type":307,"name":"head","block_statements":[{"type":357,"value":"","file":"eval code","line":5}],"file":"eval code","line":7},{"type":307,"name":"content","block_statements":[{"type":357,"value":"

Index

Welcome on my awesome homepage.

","file":"eval code","line":7}],"file":"eval code","line":8}]},"compile":{"outcome":"throw","value":"Template file tests/support/assets/views/extends/parent.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:extends/children2.volt": {"source":"{% extends \"tests/support/assets/views/extends/parent.volt\" %}\n\n{% block title %}Index{% endblock %}\n\n{% block head %} {{ super() }} {% endblock %}\n\n{% block content %}

Index

Welcome to my awesome homepage.

{% endblock %}\n\n{% block footer %}{{ super() }}{% endblock %}\n","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"tests/support/assets/views/extends/parent.volt","file":"eval code","line":1},"file":"eval code","line":3},{"type":307,"name":"title","block_statements":[{"type":357,"value":"Index","file":"eval code","line":3}],"file":"eval code","line":5},{"type":307,"name":"head","block_statements":[{"type":357,"value":" ","file":"eval code","line":5},{"type":359,"expr":{"type":350,"name":{"type":265,"value":"super","file":"eval code","line":5},"file":"eval code","line":5},"file":"eval code","line":5},{"type":357,"value":" ","file":"eval code","line":5}],"file":"eval code","line":7},{"type":307,"name":"content","block_statements":[{"type":357,"value":"

Index

Welcome to my awesome homepage.

","file":"eval code","line":7}],"file":"eval code","line":9},{"type":307,"name":"footer","block_statements":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"super","file":"eval code","line":9},"file":"eval code","line":9},"file":"eval code","line":9}],"file":"eval code","line":10}]},"compile":{"outcome":"throw","value":"Template file tests/support/assets/views/extends/parent.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:extends/nested/base.volt": {"source":"{% block content %}{% endblock %}","parse":{"outcome":"value","value":[{"type":357,"value":"","file":"eval code","line":1},{"type":307,"name":"content","file":"eval code","line":1},{"type":357,"value":"","file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cphalcon-views:extends/nested/leaf.volt": {"source":"{% extends \"extends/nested/sub.volt\" %}","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"extends/nested/sub.volt","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file extends/nested/sub.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:extends/nested/mid.volt": {"source":"{% extends \"extends/nested/base.volt\" %}{% block content %}{{ partial(\"body\") }} MID {% endblock %}","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"extends/nested/base.volt","file":"eval code","line":1},"file":"eval code","line":1},{"type":307,"name":"content","block_statements":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"partial","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"body","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":" MID ","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file extends/nested/base.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:extends/nested/sub.volt": {"source":"{% extends \"extends/nested/mid.volt\" %}","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"extends/nested/mid.volt","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file extends/nested/mid.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:extends/themes/theme-a/child.volt": {"source":"{% extends \"../theme-b/base.volt\" %}{% block content %}overridden{% endblock %}","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"../theme-b/base.volt","file":"eval code","line":1},"file":"eval code","line":1},{"type":307,"name":"content","block_statements":[{"type":357,"value":"overridden","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file ./../theme-b/base.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:extends/themes/theme-b/base.volt": {"source":"{% block content %}base{% endblock %}","parse":{"outcome":"value","value":[{"type":357,"value":"","file":"eval code","line":1},{"type":307,"name":"content","block_statements":[{"type":357,"value":"base","file":"eval code","line":1}],"file":"eval code","line":1},{"type":357,"value":"","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"base"}}, + "cphalcon-views:filters/default.volt": {"source":"{{ robot.price|default(10.0) }}\n","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":46,"left":{"type":265,"value":"robot","file":"eval code","line":1},"right":{"type":265,"value":"price","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"default","file":"eval code","line":1},"arguments":[{"expr":{"type":259,"value":"10.0","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":2},{"type":357,"value":"\n","file":"eval code","line":2}]},"compile":{"outcome":"value","value":"price) ? (10.0) : ($robot->price)) ?>\n"}}, + "cphalcon-views:filters/default_json_encode.volt": {"source":"{{ preparedParams|default([])|json_encode }}\n","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":124,"left":{"type":265,"value":"preparedParams","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"default","file":"eval code","line":1},"arguments":[{"expr":{"type":360,"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"json_encode","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":2},{"type":357,"value":"\n","file":"eval code","line":2}]},"compile":{"outcome":"value","value":"\n"}}, + "cphalcon-views:layouts/compiler.volt": {"source":"{% if some_eval %}\nClearly, the song is: {{ content() }}.\n{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"some_eval","file":"eval code","line":1},"true_statements":[{"type":357,"value":"\nClearly, the song is: ","file":"eval code","line":2},{"type":359,"expr":{"type":350,"name":{"type":265,"value":"content","file":"eval code","line":2},"file":"eval code","line":2},"file":"eval code","line":3},{"type":357,"value":".\n","file":"eval code","line":3}],"file":"eval code","line":3}]},"compile":{"outcome":"value","value":"\nClearly, the song is: getContent() ?>.\n"}}, + "cphalcon-views:macro/conditionaldate.volt": {"source":"{%- macro conditionaldate(condition, tdate, ttime, tz) -%}\n {%- if condition -%} from
{{ tdate }}, {{ ttime }} {{ tz }}{%- endif -%}\n{%- endmacro -%}\n\n{%- set tdate = date('Y-m-d') -%}\n{%- set ttime = date('H:i') -%}\n{%- set tz = 'UTC' -%}\n\n{{- conditionaldate(true, tdate, ttime, tz) -}}\n","parse":{"outcome":"value","value":[{"type":322,"name":"conditionaldate","parameters":[{"variable":"condition","file":"eval code","line":1},{"variable":"tdate","file":"eval code","line":1},{"variable":"ttime","file":"eval code","line":1},{"variable":"tz","file":"eval code","line":1}],"block_statements":[{"type":300,"expr":{"type":265,"value":"condition","file":"eval code","line":2},"true_statements":[{"type":357,"value":"from
","file":"eval code","line":2},{"type":359,"expr":{"type":265,"value":"tdate","file":"eval code","line":2},"file":"eval code","line":2},{"type":357,"value":", ","file":"eval code","line":2},{"type":359,"expr":{"type":265,"value":"ttime","file":"eval code","line":2},"file":"eval code","line":2},{"type":357,"value":" ","file":"eval code","line":2},{"type":359,"expr":{"type":265,"value":"tz","file":"eval code","line":2},"file":"eval code","line":2}],"file":"eval code","line":3}],"file":"eval code","line":5},{"type":306,"assignments":[{"variable":{"type":265,"value":"tdate","file":"eval code","line":5},"op":61,"expr":{"type":350,"name":{"type":265,"value":"date","file":"eval code","line":5},"arguments":[{"expr":{"type":260,"value":"Y-m-d","file":"eval code","line":5},"file":"eval code","line":5}],"file":"eval code","line":5},"file":"eval code","line":5}]},{"type":306,"assignments":[{"variable":{"type":265,"value":"ttime","file":"eval code","line":6},"op":61,"expr":{"type":350,"name":{"type":265,"value":"date","file":"eval code","line":6},"arguments":[{"expr":{"type":260,"value":"H:i","file":"eval code","line":6},"file":"eval code","line":6}],"file":"eval code","line":6},"file":"eval code","line":6}]},{"type":306,"assignments":[{"variable":{"type":265,"value":"tz","file":"eval code","line":7},"op":61,"expr":{"type":260,"value":"UTC","file":"eval code","line":7},"file":"eval code","line":7}]},{"type":359,"expr":{"type":350,"name":{"type":265,"value":"conditionaldate","file":"eval code","line":9},"arguments":[{"expr":{"type":263,"file":"eval code","line":9},"file":"eval code","line":9},{"expr":{"type":265,"value":"tdate","file":"eval code","line":9},"file":"eval code","line":9},{"expr":{"type":265,"value":"ttime","file":"eval code","line":9},"file":"eval code","line":9},{"expr":{"type":265,"value":"tz","file":"eval code","line":9},"file":"eval code","line":9}],"file":"eval code","line":9},"file":"eval code","line":10}]},"compile":{"outcome":"value","value":"macros['conditionaldate'] = function($__p = null) { if (isset($__p[0])) { $condition = $__p[0]; } else { if (array_key_exists(\"condition\", $__p)) { $condition = $__p[\"condition\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'conditionaldate' was called without parameter: condition\"); } } if (isset($__p[1])) { $tdate = $__p[1]; } else { if (array_key_exists(\"tdate\", $__p)) { $tdate = $__p[\"tdate\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'conditionaldate' was called without parameter: tdate\"); } } if (isset($__p[2])) { $ttime = $__p[2]; } else { if (array_key_exists(\"ttime\", $__p)) { $ttime = $__p[\"ttime\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'conditionaldate' was called without parameter: ttime\"); } } if (isset($__p[3])) { $tz = $__p[3]; } else { if (array_key_exists(\"tz\", $__p)) { $tz = $__p[\"tz\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'conditionaldate' was called without parameter: tz\"); } } ?>from
, macros['conditionaldate'] = \\Closure::bind($this->macros['conditionaldate'], $this); ?>callMacro('conditionaldate', [true, $tdate, $ttime, $tz]) ?>"}}, + "cphalcon-views:macro/error_messages.volt": {"source":"{%- macro error_messages(message, field, type) -%}\n
{{ type }}{{ field }}{{ message }}
\n{%- endmacro -%}\n\n{{- error_messages('type': 'Invalid', 'message': 'The name is invalid', 'field': 'name') -}}\n","parse":{"outcome":"value","value":[{"type":322,"name":"error_messages","parameters":[{"variable":"message","file":"eval code","line":1},{"variable":"field","file":"eval code","line":1},{"variable":"type","file":"eval code","line":1}],"block_statements":[{"type":357,"value":"
","file":"eval code","line":2},{"type":359,"expr":{"type":265,"value":"type","file":"eval code","line":2},"file":"eval code","line":2},{"type":357,"value":"","file":"eval code","line":2},{"type":359,"expr":{"type":265,"value":"field","file":"eval code","line":2},"file":"eval code","line":2},{"type":357,"value":"","file":"eval code","line":2},{"type":359,"expr":{"type":265,"value":"message","file":"eval code","line":2},"file":"eval code","line":3},{"type":357,"value":"
","file":"eval code","line":3}],"file":"eval code","line":5},{"type":359,"expr":{"type":350,"name":{"type":265,"value":"error_messages","file":"eval code","line":5},"arguments":[{"expr":{"type":260,"value":"Invalid","file":"eval code","line":5},"name":"type","file":"eval code","line":5},{"expr":{"type":260,"value":"The name is invalid","file":"eval code","line":5},"name":"message","file":"eval code","line":5},{"expr":{"type":260,"value":"name","file":"eval code","line":5},"name":"field","file":"eval code","line":5}],"file":"eval code","line":5},"file":"eval code","line":6}]},"compile":{"outcome":"value","value":"macros['error_messages'] = function($__p = null) { if (isset($__p[0])) { $message = $__p[0]; } else { if (array_key_exists(\"message\", $__p)) { $message = $__p[\"message\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'error_messages' was called without parameter: message\"); } } if (isset($__p[1])) { $field = $__p[1]; } else { if (array_key_exists(\"field\", $__p)) { $field = $__p[\"field\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'error_messages' was called without parameter: field\"); } } if (isset($__p[2])) { $type = $__p[2]; } else { if (array_key_exists(\"type\", $__p)) { $type = $__p[\"type\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'error_messages' was called without parameter: type\"); } } ?>
macros['error_messages'] = \\Closure::bind($this->macros['error_messages'], $this); ?>callMacro('error_messages', ['type' => 'Invalid', 'message' => 'The name is invalid', 'field' => 'name']) ?>"}}, + "cphalcon-views:macro/form_row.volt": {"source":"{%- macro formRow(form, tag, attributes = '', col = 6) -%}\n {%- set defaultClass = 'form-control ' -%}\n\n {%- if attributes is iterable -%}\n {%- for key, value in attributes -%}\n {%- set attr[key] = value -%}\n {%-endfor -%}\n {%- else -%}\n {%- set attr['class'] = defaultClass ~ attributes -%}\n {%-endif -%}\n\n
\n \n
{{ form.render(tag, attr) }}
\n
\n{%- endmacro -%}\n\n\n{{- formRow(formLogin, 'password') -}}\n","parse":{"outcome":"value","value":[{"type":322,"name":"formRow","parameters":[{"variable":"form","file":"eval code","line":1},{"variable":"tag","file":"eval code","line":1},{"variable":"attributes","default":{"type":260,"value":"","file":"eval code","line":1},"file":"eval code","line":1},{"variable":"col","default":{"type":258,"value":"6","file":"eval code","line":1},"file":"eval code","line":1}],"block_statements":[{"type":306,"assignments":[{"variable":{"type":265,"value":"defaultClass","file":"eval code","line":2},"op":61,"expr":{"type":260,"value":"form-control ","file":"eval code","line":2},"file":"eval code","line":2}]},{"type":300,"expr":{"type":391,"left":{"type":265,"value":"attributes","file":"eval code","line":4},"file":"eval code","line":4},"true_statements":[{"type":304,"variable":"value","key":"key","expr":{"type":265,"value":"attributes","file":"eval code","line":5},"block_statements":[{"type":306,"assignments":[{"variable":{"type":361,"left":{"type":265,"value":"attr","file":"eval code","line":6},"right":{"type":265,"value":"key","file":"eval code","line":6},"file":"eval code","line":6},"op":61,"expr":{"type":265,"value":"value","file":"eval code","line":6},"file":"eval code","line":6}]}],"file":"eval code","line":8}],"false_statements":[{"type":306,"assignments":[{"variable":{"type":361,"left":{"type":265,"value":"attr","file":"eval code","line":9},"right":{"type":260,"value":"class","file":"eval code","line":9},"file":"eval code","line":9},"op":61,"expr":{"type":126,"left":{"type":265,"value":"defaultClass","file":"eval code","line":9},"right":{"type":265,"value":"attributes","file":"eval code","line":9},"file":"eval code","line":9},"file":"eval code","line":9}]}],"file":"eval code","line":13},{"type":357,"value":"
\n \n
","file":"eval code","line":14},{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"form","file":"eval code","line":14},"right":{"type":265,"value":"render","file":"eval code","line":14},"file":"eval code","line":14},"arguments":[{"expr":{"type":265,"value":"tag","file":"eval code","line":14},"file":"eval code","line":14},{"expr":{"type":265,"value":"attr","file":"eval code","line":14},"file":"eval code","line":14}],"file":"eval code","line":14},"file":"eval code","line":16},{"type":357,"value":"
\n
","file":"eval code","line":16}],"file":"eval code","line":19},{"type":359,"expr":{"type":350,"name":{"type":265,"value":"formRow","file":"eval code","line":19},"arguments":[{"expr":{"type":265,"value":"formLogin","file":"eval code","line":19},"file":"eval code","line":19},{"expr":{"type":260,"value":"password","file":"eval code","line":19},"file":"eval code","line":19}],"file":"eval code","line":19},"file":"eval code","line":20}]},"compile":{"outcome":"value","value":"macros['formRow'] = function($__p = null) { if (isset($__p[0])) { $form = $__p[0]; } else { if (array_key_exists(\"form\", $__p)) { $form = $__p[\"form\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'formRow' was called without parameter: form\"); } } if (isset($__p[1])) { $tag = $__p[1]; } else { if (array_key_exists(\"tag\", $__p)) { $tag = $__p[\"tag\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'formRow' was called without parameter: tag\"); } } if (isset($__p[2])) { $attributes = $__p[2]; } else { if (array_key_exists(\"attributes\", $__p)) { $attributes = $__p[\"attributes\"]; } else { $attributes = ''; } } if (isset($__p[3])) { $col = $__p[3]; } else { if (array_key_exists(\"col\", $__p)) { $col = $__p[\"col\"]; } else { $col = 6; } } ?> $value) { ?>
\n \n
\">render($tag, $attr) ?>
\n
macros['formRow'] = \\Closure::bind($this->macros['formRow'], $this); ?>callMacro('formRow', [$formLogin, 'password']) ?>"}}, + "cphalcon-views:macro/hello.volt": {"source":"{%- macro hello(name) -%}\n {%- return \"Hello \" ~ name -%}\n{%- endmacro -%}\n\n{{- hello('World') -}}\n","parse":{"outcome":"value","value":[{"type":322,"name":"hello","parameters":[{"variable":"name","file":"eval code","line":1}],"block_statements":[{"type":327,"expr":{"type":126,"left":{"type":260,"value":"Hello ","file":"eval code","line":2},"right":{"type":265,"value":"name","file":"eval code","line":2},"file":"eval code","line":2},"file":"eval code","line":3}],"file":"eval code","line":5},{"type":359,"expr":{"type":350,"name":{"type":265,"value":"hello","file":"eval code","line":5},"arguments":[{"expr":{"type":260,"value":"World","file":"eval code","line":5},"file":"eval code","line":5}],"file":"eval code","line":5},"file":"eval code","line":6}]},"compile":{"outcome":"value","value":"macros['hello'] = function($__p = null) { if (isset($__p[0])) { $name = $__p[0]; } else { if (array_key_exists(\"name\", $__p)) { $name = $__p[\"name\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'hello' was called without parameter: name\"); } } ?>macros['hello'] = \\Closure::bind($this->macros['hello'], $this); ?>callMacro('hello', ['World']) ?>"}}, + "cphalcon-views:macro/list.volt": {"source":"{%- macro list(var) -%}\n {{- dump(var) -}}\n{%- endmacro -%}\n\n{{- list(object) -}}\n","parse":{"outcome":"value","value":[{"type":322,"name":"list","parameters":[{"variable":"var","file":"eval code","line":1}],"block_statements":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"dump","file":"eval code","line":2},"arguments":[{"expr":{"type":265,"value":"var","file":"eval code","line":2},"file":"eval code","line":2}],"file":"eval code","line":2},"file":"eval code","line":3}],"file":"eval code","line":5},{"type":359,"expr":{"type":350,"name":{"type":265,"value":"list","file":"eval code","line":5},"arguments":[{"expr":{"type":265,"value":"object","file":"eval code","line":5},"file":"eval code","line":5}],"file":"eval code","line":5},"file":"eval code","line":6}]},"compile":{"outcome":"value","value":"macros['list'] = function($__p = null) { if (isset($__p[0])) { $var = $__p[0]; } else { if (array_key_exists(\"var\", $__p)) { $var = $__p[\"var\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'list' was called without parameter: var\"); } } ?>macros['list'] = \\Closure::bind($this->macros['list'], $this); ?>callMacro('list', [$object]) ?>"}}, + "cphalcon-views:macro/my_input.volt": {"source":"{%- macro my_input(name, class=\"input-text\") -%}\n {%- return inputText(name, null, ['class': class]) -%}\n{%- endmacro -%}\n\n{{- '

' ~ my_input('name') ~ '

' -}}\n","parse":{"outcome":"value","value":[{"type":322,"name":"my_input","parameters":[{"variable":"name","file":"eval code","line":1},{"variable":"class","default":{"type":260,"value":"input-text","file":"eval code","line":1},"file":"eval code","line":1}],"block_statements":[{"type":327,"expr":{"type":350,"name":{"type":265,"value":"inputText","file":"eval code","line":2},"arguments":[{"expr":{"type":265,"value":"name","file":"eval code","line":2},"file":"eval code","line":2},{"expr":{"type":261,"file":"eval code","line":2},"file":"eval code","line":2},{"expr":{"type":360,"left":[{"expr":{"type":265,"value":"class","file":"eval code","line":2},"name":"class","file":"eval code","line":2}],"file":"eval code","line":2},"file":"eval code","line":2}],"file":"eval code","line":2},"file":"eval code","line":3}],"file":"eval code","line":5},{"type":359,"expr":{"type":126,"left":{"type":126,"left":{"type":260,"value":"

","file":"eval code","line":5},"right":{"type":350,"name":{"type":265,"value":"my_input","file":"eval code","line":5},"arguments":[{"expr":{"type":260,"value":"name","file":"eval code","line":5},"file":"eval code","line":5}],"file":"eval code","line":5},"file":"eval code","line":5},"right":{"type":260,"value":"

","file":"eval code","line":5},"file":"eval code","line":5},"file":"eval code","line":6}]},"compile":{"outcome":"value","value":"macros['my_input'] = function($__p = null) { if (isset($__p[0])) { $name = $__p[0]; } else { if (array_key_exists(\"name\", $__p)) { $name = $__p[\"name\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'my_input' was called without parameter: name\"); } } if (isset($__p[1])) { $class = $__p[1]; } else { if (array_key_exists(\"class\", $__p)) { $class = $__p[\"class\"]; } else { $class = 'input-text'; } } ?>callMacro('inputText', [$name, null, ['class' => $class]]); ?>macros['my_input'] = \\Closure::bind($this->macros['my_input'], $this); ?>' . $this->callMacro('my_input', ['name']) . '

' ?>"}}, + "cphalcon-views:macro/null-value.volt": {"source":"{%- macro print(object) -%}\n {{- 'Not Null: ' ~ object.notNullValue ~ ' - Null: ' ~ object.nullValue -}}\n{%- endmacro -%}\n\n{{- print(object) -}}\n","parse":{"outcome":"value","value":[{"type":322,"name":"print","parameters":[{"variable":"object","file":"eval code","line":1}],"block_statements":[{"type":359,"expr":{"type":126,"left":{"type":126,"left":{"type":126,"left":{"type":260,"value":"Not Null: ","file":"eval code","line":2},"right":{"type":46,"left":{"type":265,"value":"object","file":"eval code","line":2},"right":{"type":265,"value":"notNullValue","file":"eval code","line":2},"file":"eval code","line":2},"file":"eval code","line":2},"right":{"type":260,"value":" - Null: ","file":"eval code","line":2},"file":"eval code","line":2},"right":{"type":46,"left":{"type":265,"value":"object","file":"eval code","line":2},"right":{"type":265,"value":"nullValue","file":"eval code","line":2},"file":"eval code","line":2},"file":"eval code","line":2},"file":"eval code","line":3}],"file":"eval code","line":5},{"type":359,"expr":{"type":350,"name":{"type":265,"value":"print","file":"eval code","line":5},"arguments":[{"expr":{"type":265,"value":"object","file":"eval code","line":5},"file":"eval code","line":5}],"file":"eval code","line":5},"file":"eval code","line":6}]},"compile":{"outcome":"value","value":"macros['print'] = function($__p = null) { if (isset($__p[0])) { $object = $__p[0]; } else { if (array_key_exists(\"object\", $__p)) { $object = $__p[\"object\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'print' was called without parameter: object\"); } } ?>notNullValue . ' - Null: ' . $object->nullValue ?>macros['print'] = \\Closure::bind($this->macros['print'], $this); ?>callMacro('print', [$object]) ?>"}}, + "cphalcon-views:macro/related_links.volt": {"source":"{%- macro related_bar(related_links) -%}\n \n{%- endmacro -%}\n\n{{- related_bar(links) -}}\n","parse":{"outcome":"value","value":[{"type":322,"name":"related_bar","parameters":[{"variable":"related_links","file":"eval code","line":1}],"block_statements":[{"type":357,"value":"","file":"eval code","line":7}],"file":"eval code","line":9},{"type":359,"expr":{"type":350,"name":{"type":265,"value":"related_bar","file":"eval code","line":9},"arguments":[{"expr":{"type":265,"value":"links","file":"eval code","line":9},"file":"eval code","line":9}],"file":"eval code","line":9},"file":"eval code","line":10}]},"compile":{"outcome":"value","value":"macros['related_bar'] = function($__p = null) { if (isset($__p[0])) { $related_links = $__p[0]; } else { if (array_key_exists(\"related_links\", $__p)) { $related_links = $__p[\"related_links\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'related_bar' was called without parameter: related_links\"); } } ?>macros['related_bar'] = \\Closure::bind($this->macros['related_bar'], $this); ?>callMacro('related_bar', [$links]) ?>"}}, + "cphalcon-views:macro/strtotime.volt": {"source":"{{- date.getTimeStamp() -}} % {{- strtotime('now') -}} % {{- strtotime(date.format('Y-m-d H:i:s')) -}}\n","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"date","file":"eval code","line":1},"right":{"type":265,"value":"getTimeStamp","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"%","file":"eval code","line":1},{"type":359,"expr":{"type":350,"name":{"type":265,"value":"strtotime","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"now","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"%","file":"eval code","line":1},{"type":359,"expr":{"type":350,"name":{"type":265,"value":"strtotime","file":"eval code","line":1},"arguments":[{"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"date","file":"eval code","line":1},"right":{"type":265,"value":"format","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"Y-m-d H:i:s","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":2}]},"compile":{"outcome":"value","value":"getTimeStamp() ?>%callMacro('strtotime', ['now']) ?>%callMacro('strtotime', [$date->format('Y-m-d H:i:s')]) ?>"}}, + "cphalcon-views:partials/header2.volt": {"source":"

{% include \"partials/header3.volt\" %}

","parse":{"outcome":"value","value":[{"type":357,"value":"

","file":"eval code","line":1},{"type":313,"path":{"type":260,"value":"partials/header3.volt","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"

","file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file partials/header3.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:switch-case/simple-usage.volt": {"source":"{% switch username %}\n {% case \"Jim\" %}\n Hello username\n {% case \"Nik\" %}\n {{ username }}!\n {% break %}\n {% default %}\n Who are you?\n{% endswitch %}\n","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"username","file":"eval code","line":1},"case_clauses":[{"type":357,"value":"\n ","file":"eval code","line":2},{"type":412,"expr":{"type":260,"value":"Jim","file":"eval code","line":2},"file":"eval code","line":4},{"type":357,"value":"\n Hello username\n ","file":"eval code","line":4},{"type":412,"expr":{"type":260,"value":"Nik","file":"eval code","line":4},"file":"eval code","line":5},{"type":357,"value":"\n ","file":"eval code","line":5},{"type":359,"expr":{"type":265,"value":"username","file":"eval code","line":5},"file":"eval code","line":6},{"type":357,"value":"!\n ","file":"eval code","line":6},{"type":320,"file":"eval code","line":7},{"type":357,"value":"\n ","file":"eval code","line":7},{"type":413,"file":"eval code","line":9},{"type":357,"value":"\n Who are you?\n","file":"eval code","line":9}],"file":"eval code","line":10},{"type":357,"value":"\n","file":"eval code","line":10}]},"compile":{"outcome":"value","value":"\n\nHello username\n\n!\n\n\nWho are you?\n\n"}}, + "cphalcon-views:templates/a.volt": {"source":"[A[{% block body %}{% endblock %}]]\n","parse":{"outcome":"value","value":[{"type":357,"value":"[A[","file":"eval code","line":1},{"type":307,"name":"body","file":"eval code","line":2},{"type":357,"value":"]]\n","file":"eval code","line":2}]},"compile":{"outcome":"value","value":"[A[]]\n"}}, + "cphalcon-views:templates/b.volt": {"source":"{% extends 'tests/support/assets/views/templates/a.volt' %}{% block body %}[B]{% endblock %}\n","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"tests/support/assets/views/templates/a.volt","file":"eval code","line":1},"file":"eval code","line":1},{"type":307,"name":"body","block_statements":[{"type":357,"value":"[B]","file":"eval code","line":1}],"file":"eval code","line":2}]},"compile":{"outcome":"throw","value":"Template file tests/support/assets/views/templates/a.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "cphalcon-views:templates/c.volt": {"source":"{% extends 'tests/support/assets/views/templates/b.volt' %}{% block body %}###{{ super() }}###{% endblock %}\n","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"tests/support/assets/views/templates/b.volt","file":"eval code","line":1},"file":"eval code","line":1},{"type":307,"name":"body","block_statements":[{"type":357,"value":"###","file":"eval code","line":1},{"type":359,"expr":{"type":350,"name":{"type":265,"value":"super","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"###","file":"eval code","line":1}],"file":"eval code","line":2}]},"compile":{"outcome":"throw","value":"Template file tests/support/assets/views/templates/b.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "phalcon:Compiler/CompileCallTest#1": {"source":"{% call m(1) %}BODY{% endcall %}","parse":{"outcome":"value","value":[{"type":325,"name":{"type":265,"value":"m","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":357,"value":"BODY","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "phalcon:Compiler/CompileTest#1": {"source":"

{% block a %}PA{% endblock %}

","parse":{"outcome":"value","value":[{"type":357,"value":"

","file":"eval code","line":1},{"type":307,"name":"a","block_statements":[{"type":357,"value":"PA","file":"eval code","line":1}],"file":"eval code","line":1},{"type":357,"value":"

","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"

PA

"}}, + "phalcon:Compiler/CompileTest#2": {"source":"

{% block a %}NEW{% endblock %}

","parse":{"outcome":"value","value":[{"type":357,"value":"

","file":"eval code","line":1},{"type":307,"name":"a","block_statements":[{"type":357,"value":"NEW","file":"eval code","line":1}],"file":"eval code","line":1},{"type":357,"value":"

","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"

NEW

"}}, + "phalcon:Compiler/CompileTest#3": {"source":"

{% block a %}PA{% endblock %}|{% block b %}PB{% endblock %}

","parse":{"outcome":"value","value":[{"type":357,"value":"

","file":"eval code","line":1},{"type":307,"name":"a","block_statements":[{"type":357,"value":"PA","file":"eval code","line":1}],"file":"eval code","line":1},{"type":357,"value":"|","file":"eval code","line":1},{"type":307,"name":"b","block_statements":[{"type":357,"value":"PB","file":"eval code","line":1}],"file":"eval code","line":1},{"type":357,"value":"

","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"

PA|PB

"}}, + "phalcon:Compiler/CompileTest#4": {"source":"layout.volt' %}{% block a %}ONE{% endblock %}","parse":{"outcome":"value","value":[{"type":357,"value":"layout.volt' %}","file":"eval code","line":1},{"type":307,"name":"a","block_statements":[{"type":357,"value":"ONE","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"layout.volt' %}ONE"}}, + "phalcon:Compiler/CompileTest#5": {"source":"layout.volt' %}{% block b %}TWO{% endblock %}","parse":{"outcome":"value","value":[{"type":357,"value":"layout.volt' %}","file":"eval code","line":1},{"type":307,"name":"b","block_statements":[{"type":357,"value":"TWO","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"layout.volt' %}TWO"}}, + "volt:Compiler/SetTest#1": {"source":"{% set icon = '' %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"icon","file":"eval code","line":1},"op":61,"expr":{"type":260,"value":"","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":"'; ?>"}}, + "volt:Parser/ParserTest#1": {"source":"{% block outer %}{% block inner %}{% endblock %}{% endblock %}","parse":{"outcome":"throw","value":"Embedding blocks into other blocks is not supported in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Embedding blocks into other blocks is not supported in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "volt:Parser/ParserTest#2": {"source":"{% call greet() %}{% endcall %}","parse":{"outcome":"value","value":[{"type":325,"name":{"type":265,"value":"greet","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "volt:Parser/ParserTest#3": {"source":"{% case 1 %}","parse":{"outcome":"throw","value":"Unexpected CASE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Unexpected CASE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "volt:Parser/ParserTest#4": {"source":"{{ {'key': 'value'} }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":260,"value":"value","file":"eval code","line":1},"name":"key","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" 'value'] ?>"}}, + "volt:Parser/ParserTest#5": {"source":"{% set counter /= 2 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"counter","file":"eval code","line":1},"op":284,"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "volt:Parser/ParserTest#6": {"source":"{% for x in items %}{{ x }}{% elsefor %}empty{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"x","expr":{"type":265,"value":"items","file":"eval code","line":1},"block_statements":[{"type":359,"expr":{"type":265,"value":"x","file":"eval code","line":1},"file":"eval code","line":1},{"type":321,"file":"eval code","line":1},{"type":357,"value":"empty","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"empty"}}, + "volt:Parser/ParserTest#7": {"source":"{% for x in items %}{{ x }}{% else %}empty{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"x","expr":{"type":265,"value":"items","file":"eval code","line":1},"block_statements":[{"type":359,"expr":{"type":265,"value":"x","file":"eval code","line":1},"file":"eval code","line":1},{"type":321,"file":"eval code","line":1},{"type":357,"value":"empty","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"empty"}}, + "volt:Parser/ParserTest#8": {"source":"{% elseif x %}","parse":{"outcome":"throw","value":"Unexpected ENDIF in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Unexpected ENDIF in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "volt:Parser/ParserTest#9": {"source":"{% endswitch %}","parse":{"outcome":"throw","value":"Unexpected ENDSWITCH in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Unexpected ENDSWITCH in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "volt:Parser/ParserTest#10": {"source":"{% extends 'base.volt' %}{% block content %}hello{% endblock %}","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"base.volt","file":"eval code","line":1},"file":"eval code","line":1},{"type":307,"name":"content","block_statements":[{"type":357,"value":"hello","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file base.volt does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "volt:Parser/ParserTest#11": {"source":"{% extends \"base.volt\" %}{% for x in y %}{% endfor %}","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "volt:Parser/ParserTest#12": {"source":"{% extends \"base.volt\" %}{% if x %}yes{% endif %}","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "volt:Parser/ParserTest#13": {"source":"{% if active %}yes{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"active","file":"eval code","line":1},"true_statements":[{"type":357,"value":"yes","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"yes"}}, + "volt:Parser/ParserTest#14": {"source":"{% include \"partial.volt\" with vars %}","parse":{"outcome":"value","value":[{"type":313,"path":{"type":260,"value":"partial.volt","file":"eval code","line":1},"params":{"type":265,"value":"vars","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"partial('partial.volt', $vars); ?>"}}, + "volt:Parser/ParserTest#15": {"source":"{% macro outer() %}{% macro inner() %}{% endmacro %}{% endmacro %}","parse":{"outcome":"throw","value":"Embedding macros into other macros is not allowed in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Embedding macros into other macros is not allowed in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "volt:Parser/ParserTest#16": {"source":"{% set counter *= 2 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"counter","file":"eval code","line":1},"op":283,"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "volt:Parser/ParserTest#17": {"source":"{% switch x %}{% switch y %}{% endswitch %}{% endswitch %}","parse":{"outcome":"throw","value":"A nested switch detected. There is no nested switch-case statements support in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"A nested switch detected. There is no nested switch-case statements support in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "volt:Parser/ParserTest#18": {"source":"{% extends \"base.volt\" %}{{ something }}","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "volt:Parser/ParserTest#19": {"source":"{% extends \"base.volt\" %}non-blank content","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "volt:Parser/ParserTest#20": {"source":"{% macro compute(x) %}{% return x %}{% endmacro %}","parse":{"outcome":"value","value":[{"type":322,"name":"compute","parameters":[{"variable":"x","file":"eval code","line":1}],"block_statements":[{"type":327,"expr":{"type":265,"value":"x","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"macros['compute'] = function($__p = null) { if (isset($__p[0])) { $x = $__p[0]; } else { if (array_key_exists(\"x\", $__p)) { $x = $__p[\"x\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'compute' was called without parameter: x\"); } } ?>macros['compute'] = \\Closure::bind($this->macros['compute'], $this); ?>"}}, + "volt:Parser/ParserTest#21": {"source":"{{ link_to(\"album/\" ~ album.id ~ \"/\" ~ $album.uri, \"test\") }}","parse":{"outcome":"throw","value":"Scanning error before 'album.uri, \"test...' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before 'album.uri, \"test...' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "volt:Parser/ParserTest#22": {"source":"{% extends \"base.volt\" %}{% set x = 1 %}","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "volt:Parser/ParserTest#23": {"source":"{% set x = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"x","file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "volt:Parser/ParserTest#24": {"source":"{% extends \"base.volt\" %}{% switch x %}{% endswitch %}","parse":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Child templates only may contain blocks in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "volt:Parser/ParserTest#25": {"source":"{% switch x %}{% default %}fallback{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"x","file":"eval code","line":1},"case_clauses":[{"type":413,"file":"eval code","line":1},{"type":357,"value":"fallback","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"fallback"}}, + "volt:Parser/ParserTest#26": {"source":"{% endif %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token ENDIF in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token ENDIF in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "volt:Scanner/OpcodeTest#1": {"source":"{%","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}} + } +} diff --git a/tests/fixtures/parity/harvested.php b/tests/fixtures/parity/harvested.php new file mode 100644 index 0000000..b256a9c --- /dev/null +++ b/tests/fixtures/parity/harvested.php @@ -0,0 +1,809 @@ + '{{ str_replace("a", "b", "aabb") }}', + 'cphalcon:CallMacroTest#2' => '{{ myfunction("a") }}', + 'cphalcon:Compiler/AddFilterTest#1' => '{{ "hello"|reverse }}', + 'cphalcon:Compiler/AddFilterTest#2' => '{{ "1,2,3,4"|separate }}', + 'cphalcon:Compiler/AddFunctionTest#1' => '{{ random() }}', + 'cphalcon:Compiler/AddFunctionTest#2' => '{{ strtotime("now") }}', + 'cphalcon:Compiler/AddFunctionTest#3' => '{{ shuffle("hello") }}', + 'cphalcon:Compiler/AttributeReaderTest#1' => '{{ a.b }}', + 'cphalcon:Compiler/AttributeReaderTest#2' => '{{ a.b.c }}', + 'cphalcon:Compiler/CompileAutoEscapeTest#1' => '{% autoescape true %}{{ "hello" }}{% endautoescape %}', + 'cphalcon:Compiler/CompileCaseTest#1' => '{% switch x %}{% case 1 %}one{% endswitch %}', + 'cphalcon:Compiler/CompileDoTest#1' => '{% do a %}', + 'cphalcon:Compiler/CompileEchoTest#1' => '{{ variable }}', + 'cphalcon:Compiler/CompileElseIfTest#1' => '{% if i == 0 %}zero{% elseif i == 1 %}one{% else %}more than one{% endif %}', + 'cphalcon:Compiler/CompileForElseTest#1' => '{% for a in b %}{{ a }}{% else %}empty{% endfor %}', + 'cphalcon:Compiler/CompileForeachTest#1' => '{% for item in items %}{{ item }}{% endfor %}', + 'cphalcon:Compiler/CompileIfTest#1' => '{% if i == 0 %}zero{% else %}not zero{% endif %}', + 'cphalcon:Compiler/CompileIfTest#2' => '{% if categoryIds is defined AND category[\'id\'] in categoryIds %} + checked +{% endif %}', + 'cphalcon:Compiler/CompileIncludeTest#1' => '{% include templatePath %}', + 'cphalcon:Compiler/CompileMacroTest#1' => '{% macro myMacro() %}hello{% endmacro %}', + 'cphalcon:Compiler/CompileReturnTest#1' => '{% return true %}', + 'cphalcon:Compiler/CompileSourceExtendsModeTest#1' => '{# just a comment #}', + 'cphalcon:Compiler/CompileStringTest#1' => '{# hello #}', + 'cphalcon:Compiler/CompileStringTest#2' => '{# hello #}{# other comment #}', + 'cphalcon:Compiler/CompileStringTest#3' => '{{ "hello" }}', + 'cphalcon:Compiler/CompileStringTest#4' => '{{ "hello" }}{{ "hello" }}', + 'cphalcon:Compiler/CompileStringTest#5' => '{{ "hello" }}-{{ "hello" }}', + 'cphalcon:Compiler/CompileStringTest#6' => '-{{ "hello" }}{{ "hello" }}-', + 'cphalcon:Compiler/CompileStringTest#7' => '-{{ "hello" }}-{{ "hello" }}-', + 'cphalcon:Compiler/CompileStringTest#8' => 'Some = {{ 100+50 }}', + 'cphalcon:Compiler/CompileStringTest#9' => 'Some = {{ 100-50 }}', + 'cphalcon:Compiler/CompileStringTest#10' => 'Some = {{ 100*50 }}', + 'cphalcon:Compiler/CompileStringTest#11' => 'Some = {{ 100/50 }}', + 'cphalcon:Compiler/CompileStringTest#12' => 'Some = {{ 100%50 }}', + 'cphalcon:Compiler/CompileStringTest#13' => 'Some = {{ 100~50 }}', + 'cphalcon:Compiler/CompileStringTest#14' => '{{ -10 }}', + 'cphalcon:Compiler/CompileStringTest#15' => '{{ !10 }}', + 'cphalcon:Compiler/CompileStringTest#16' => '{{ !a }}', + 'cphalcon:Compiler/CompileStringTest#17' => '{{ not a }}', + 'cphalcon:Compiler/CompileStringTest#18' => '{% set a = [1, 2, 3, 4] %}', + 'cphalcon:Compiler/CompileStringTest#19' => '{% set a = ["hello", 2, 1.3, false, true, null] %}', + 'cphalcon:Compiler/CompileStringTest#20' => '{% set a = ["hello", 2, 3, false, true, null, [1, 2, "hola"]] %}', + 'cphalcon:Compiler/CompileStringTest#21' => '{% set a = [\'first\': 1, \'second\': 2, \'third\': 3] %}', + 'cphalcon:Compiler/CompileStringTest#22' => '{{ a[0 ]}}', + 'cphalcon:Compiler/CompileStringTest#23' => '{{ a[0 ] [ 1]}}', + 'cphalcon:Compiler/CompileStringTest#24' => '{{ a[0] [ "hello"] }}', + 'cphalcon:Compiler/CompileStringTest#25' => '{{ a[0] [1.2] [false] [true] }}', + 'cphalcon:Compiler/CompileStringTest#26' => '{{ 1..100 }}', + 'cphalcon:Compiler/CompileStringTest#27' => '{{ "Z".."A" }}', + 'cphalcon:Compiler/CompileStringTest#28' => '{{ \'a\'..\'z\' }}', + 'cphalcon:Compiler/CompileStringTest#29' => '{{ \'a\' .. \'z\' }}', + 'cphalcon:Compiler/CompileStringTest#30' => '{{ content() }}', + 'cphalcon:Compiler/CompileStringTest#31' => '{{ get_content() }}', + 'cphalcon:Compiler/CompileStringTest#32' => '{{ partial(\'hello/x\') }}', + 'cphalcon:Compiler/CompileStringTest#33' => '{{ dump(a) }}', + 'cphalcon:Compiler/CompileStringTest#34' => '{{ date(\'Y-m-d\', time()) }}', + 'cphalcon:Compiler/CompileStringTest#35' => '{{ robots.getPart(a) }}', + 'cphalcon:Compiler/CompileStringTest#36' => '{{ link_to(\'hello\', \'some-link\') }}', + 'cphalcon:Compiler/CompileStringTest#37' => '{{ form_legacy(\'action\': \'save/products\', \'method\': \'post\') }}', + 'cphalcon:Compiler/CompileStringTest#38' => '{{ stylesheet_link(config.cdn.css.bootstrap, config.cdn.local) }}', + 'cphalcon:Compiler/CompileStringTest#39' => '{{ javascript_include(\'js/some.js\') }}', + 'cphalcon:Compiler/CompileStringTest#40' => '{{ image(\'img/logo.png\', \'width\': 80) }}', + 'cphalcon:Compiler/CompileStringTest#41' => '{{ email_field(\'email\', \'class\': \'form-control\', \'placeholder\': \'Email Address\') }}', + 'cphalcon:Compiler/CompileStringTest#42' => '{{ "hello"|e }}', + 'cphalcon:Compiler/CompileStringTest#43' => '{{ "hello"|escape }}', + 'cphalcon:Compiler/CompileStringTest#44' => '{{ "hello"|trim }}', + 'cphalcon:Compiler/CompileStringTest#45' => '{{ "hello"|striptags }}', + 'cphalcon:Compiler/CompileStringTest#46' => '{{ "hello"|json_encode }}', + 'cphalcon:Compiler/CompileStringTest#47' => '{{ "hello"|url_encode }}', + 'cphalcon:Compiler/CompileStringTest#48' => '{{ "hello"|uppercase }}', + 'cphalcon:Compiler/CompileStringTest#49' => '{{ "hello"|lowercase }}', + 'cphalcon:Compiler/CompileStringTest#50' => '{{ ("hello" ~ "lol")|e|length }}', + 'cphalcon:Compiler/CompileStringTest#51' => '{{ "My name is %s, %s"|format(name, "thanks") }}', + 'cphalcon:Compiler/CompileStringTest#52' => '{{ "some name"|convert_encoding("utf-8", "latin1") }}', + 'cphalcon:Compiler/CompileStringTest#53' => '{% if a==b %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#54' => '{% if a!=b %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#55' => '{% if a is not b %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#56' => '{% if a '{% if a>b %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#58' => '{% if a>=b %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#59' => '{% if a<=b %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#60' => '{% if a===b %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#61' => '{% if a!==b %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#62' => '{% if a==b and c==d %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#63' => '{% if a==b or c==d %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#64' => '{% if a is odd %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#65' => '{% if a is even %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#66' => '{% if a is empty %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#67' => '{% if a is not empty %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#68' => '{% if a is numeric %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#69' => '{% if a is not numeric %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#70' => '{% if a is scalar %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#71' => '{% if a is not scalar %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#72' => '{% if a is iterable %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#73' => '{% if a is not iterable %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#74' => '{% if a is sameas(false) %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#75' => '{% if a is sameas(b) %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#76' => '{% if a is divisibleby(3) %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#77' => '{% if a is divisibleby(b) %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#78' => '{% if a is defined %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#79' => '{% if a is not defined %} hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#80' => '{% if a==b %} hello {% else %} not hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#81' => '{% if a==b %} {% if c==d %} hello {% endif %} {% else %} not hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#82' => '{% if a==b %} {% if c==d %} hello {% else %} not hello {% endif %}{% endif %}', + 'cphalcon:Compiler/CompileStringTest#83' => '{% if a==b %} hello {% else %} {% if c==d %} not hello {% endif %} {% endif %}', + 'cphalcon:Compiler/CompileStringTest#84' => '{% if a is empty or a is defined %} hello {% else %} not hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#85' => '{% if a is even or b is odd %} hello {% else %} not hello {% endif %}', + 'cphalcon:Compiler/CompileStringTest#86' => '{% for a in b %} hello {% endfor %}', + 'cphalcon:Compiler/CompileStringTest#87' => '{% for a in b[0] %} hello {% endfor %}', + 'cphalcon:Compiler/CompileStringTest#88' => '{% for a in b.c %} hello {% endfor %}', + 'cphalcon:Compiler/CompileStringTest#89' => '{% for key, value in [0, 1, 3, 5, 4] %} hello {% endfor %}', + 'cphalcon:Compiler/CompileStringTest#90' => '{% for key, value in [0, 1, 3, 5, 4] if key!=3 %} hello {% endfor %}', + 'cphalcon:Compiler/CompileStringTest#91' => '{% for a in 1..10 %} hello {% endfor %}', + 'cphalcon:Compiler/CompileStringTest#92' => '{% for a in 1..10 if a is even %} hello {% endfor %}', + 'cphalcon:Compiler/CompileStringTest#93' => '{% for a in 1..10 %} {% for b in 1..10 %} hello {% endfor %} {% endfor %}', + 'cphalcon:Compiler/CompileStringTest#94' => '{% for a in 1..10 %}{% break %}{% endfor %}', + 'cphalcon:Compiler/CompileStringTest#95' => '{% for a in 1..10 %}{% continue %}{% endfor %}', + 'cphalcon:Compiler/CompileStringTest#96' => '{% set a = 1 %}', + 'cphalcon:Compiler/CompileStringTest#97' => '{% set a = a-1 %}', + 'cphalcon:Compiler/CompileStringTest#98' => '{% set a = 1.2 %}', + 'cphalcon:Compiler/CompileStringTest#99' => '{% set a = 1.2+1*(20/b) and c %}', + 'cphalcon:Compiler/CompileStringTest#100' => '{{ "hello" }}{% autoescape true %}{{ "hello" }}{% autoescape false %}{{ "hello" }}{% endautoescape %}{{ "hello" }}{% endautoescape %}{{ "hello" }}', + 'cphalcon:Compiler/CompileStringTest#101' => '{# some comment #}{{ "hello" }}{# other comment }}', + 'cphalcon:Compiler/CompileStringTest#102' => '{{ [1, 2]|join(\',\') }}', + 'cphalcon:Compiler/CompileStringTest#103' => '{{ [1, 2]|join("\'") }}', + 'cphalcon:Compiler/CompileStringTest#104' => '{{ ["x", "y"]|join("\' . phpinfo() . \'") }}', + 'cphalcon:Compiler/CompileStringTest#105' => '{{ readonly|default(false) ? \'readonly="readonly"\' : \'\' }}', + 'cphalcon:Compiler/CompileStringTest#106' => '{{ \'Let\\\'s Encrypt\' }}', + 'cphalcon:Compiler/CompileStringTest#107' => '{{ "say \'hi\'" }}', + 'cphalcon:Compiler/CompileStringTest#108' => '{% set ga_action="send_ga(\'Link\', \'External\', \'" ~ item.title|striptags|url_encode ~ "\');" %}', + 'cphalcon:Compiler/CompileStringTest#109' => '{% set x = "it\'s" %}', + 'cphalcon:Compiler/CompileStringTest#110' => '{{ tag.textField(\'x".system("id")."\') }}', + 'cphalcon:Compiler/CompileStringTest#111' => '{{ tag.textField(\'{${system(chr(105).chr(100))}}\') }}', + 'cphalcon:Compiler/CompileStringTest#112' => '{{ tag.textField(\'x\\\\"\') }}', + 'cphalcon:Compiler/CompileStringTest#113' => '{{ tag.textField(\'\\t\') }}', + 'cphalcon:Compiler/CompileStringTest#114' => '{{ tag.textField(\'\\\\t\') }}', + 'cphalcon:Compiler/CompileStringTest#115' => '{{ tag.textField(\'-\') }}', + 'cphalcon:Compiler/CompileStringTest#116' => '{{ tag.textField(\'+\') }}', + 'cphalcon:Compiler/CompileStringTest#117' => '{{ tag.textField(\' \') }}', + 'cphalcon:Compiler/CompileStringTest#118' => '{{ ["x\' => system(\'id\'), \'y": 1] }}', + 'cphalcon:Compiler/CompileStringTest#119' => '{% set x = ["a\' => system(\'id\'), \'b": 1] %}', + 'cphalcon:Compiler/CompileStringTest#120' => '{{ ["x\\\\\'": 1] }}', + 'cphalcon:Compiler/CompileStringTest#121' => '{{ ["it\'s": 1] }}', + 'cphalcon:Compiler/CompileStringTest#122' => '{{ [\'it\\\'s\': 1] }}', + 'cphalcon:Compiler/CompileStringTest#123' => '{{ "x\\\\\'.injected();//" }}', + 'cphalcon:Compiler/CompileStringTest#124' => '{{ "x\\\\\'" }}', + 'cphalcon:Compiler/CompileStringTest#125' => '{{ "it\'s" }}', + 'cphalcon:Compiler/CompileStringTest#126' => '{{ "\\t" }}', + 'cphalcon:Compiler/CompileStringTest#127' => '{{ "\\\\t" }}', + 'cphalcon:Compiler/CompileStringTest#128' => '{{ "hello"|unknown }}', + 'cphalcon:Compiler/CompileStringTest#129' => '{{ "hello"|unknown(1, 2, 3) }}', + 'cphalcon:Compiler/CompileStringTest#130' => '{{ "hello"|(a-1) }}', + 'cphalcon:Compiler/CompileStringTest#131' => '[P[{% block body %}{% endblock %}]]', + 'cphalcon:Compiler/CompileStringTest#132' => '{% extends \'', + 'cphalcon:Compiler/CompileStringTest#133' => 'parent.volt\' %}{% block body %}[C]{% endblock %}', + 'cphalcon:Compiler/CompileStringTest#134' => '{{ "x" }}', + 'cphalcon:Compiler/CompileStringTest#135' => '{{ tag.doctype(5, \'-\') }}', + 'cphalcon:Compiler/CompileStringTest#136' => '{{ tag.title(\'+\', \'-\') }}', + 'cphalcon:Compiler/CompileStringTest#137' => '{{ tag.title(\' \', \' + +\') }}', + 'cphalcon:Compiler/CompileStringTest#138' => '{{ tag.style().add(\'/css/some.css\') }}', + 'cphalcon:Compiler/CompileStringTest#139' => '{{ tag.script().add(\'/js/some.js\') }}', + 'cphalcon:Compiler/CompileStringTest#140' => '{{ [', + 'cphalcon:Compiler/CompileStringTest#141' => '{{ "abc\\', + 'cphalcon:Compiler/CompileStringTest#142' => '{{ \'abc\\', + 'cphalcon:Compiler/CompileSwitchTest#1' => '{% switch x %}{% case 1 %}one{% default %}other{% endswitch %}', + 'cphalcon:Compiler/CompileSwitchTest#2' => '{% set aNumber = 1 %} +{% switch aNumber %} + {% case 0 %} + {{ greatText }} + {% break %} + {% case 1 %} + {{ false|default(\'simple text\') }} + {% break %} +{% endswitch %}', + 'cphalcon:Compiler/CompileSwitchTest#3' => '{% switch x %}{% case 1 %}one{% default %}other{% endswitch %}', + 'cphalcon:Compiler/CompileSwitchTest#4' => '{% switch x %}{% case 1 %}one{%- default -%}other{% endswitch %}', + 'cphalcon:Compiler/CompileSwitchTest#5' => '{% switch x %}{% case 1 %}one{% default %}{{ value|default(\'unknown\') }}{% endswitch %}', + 'cphalcon:Compiler/CompileSwitchTest#6' => '{{ value|default(\'unknown\') }}', + 'cphalcon:Compiler/CompileSwitchTest#7' => '{% switch x %}{% case 1 %}{% set default = \'abc\' %}{{ default }}{% endswitch %}', + 'cphalcon:Compiler/CompileTest#1' => '{% block content %}Hello{% endblock %}', + 'cphalcon:Compiler/FireExtensionEventTest#1' => '{{ add_extension() }}a{{ 1 }}b', + 'cphalcon:Compiler/FireExtensionEventTest#2' => 'ext_raw{{ ext_function() }}{{ "ext_expression" }}{{ 1|ext_filter }}{{ "other" }}', + 'cphalcon:Compiler/FunctionCallTest#1' => '{{ partial("abc.volt") }}', + 'cphalcon:Compiler/FunctionCallTest#2' => '{{ link_to(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#3' => '{{ image(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#4' => '{{ form_legacy(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#5' => '{{ submit_button(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#6' => '{{ radio_field(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#7' => '{{ check_field(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#8' => '{{ file_field(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#9' => '{{ hidden_field(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#10' => '{{ password_field(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#11' => '{{ text_area(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#12' => '{{ text_field(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#13' => '{{ email_field(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#14' => '{{ date_field(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#15' => '{{ tel_field(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#16' => '{{ numeric_field(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#17' => '{{ image_input(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#18' => '{{ url(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#19' => '{{ static_url(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#20' => '{{ date(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#21' => '{{ time() }}', + 'cphalcon:Compiler/FunctionCallTest#22' => '{{ dump(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#23' => '{{ version() }}', + 'cphalcon:Compiler/FunctionCallTest#24' => '{{ version_id() }}', + 'cphalcon:Compiler/FunctionCallTest#25' => '{{ constant(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#26' => '{{ preload(\'abc.css\') }}', + 'cphalcon:Compiler/FunctionCallTest#27' => '{{ preload(\'abc.jpg\', [\'as\' : \'image\']) }}', + 'cphalcon:Compiler/FunctionCallTest#28' => '{{ somefunction(\'abc\') }}', + 'cphalcon:Compiler/FunctionCallTest#29' => '{{ "abc" | length }}', + 'cphalcon:Compiler/FunctionCallTest#30' => '{{ "abc" | e }}', + 'cphalcon:Compiler/FunctionCallTest#31' => '{{ "abc" | escape }}', + 'cphalcon:Compiler/FunctionCallTest#32' => '{{ "abc" | escape_css }}', + 'cphalcon:Compiler/FunctionCallTest#33' => '{{ "abc" | escape_js }}', + 'cphalcon:Compiler/FunctionCallTest#34' => '{{ "abc" | escape_attr }}', + 'cphalcon:Compiler/FunctionCallTest#35' => '{{ "abc" | trim }}', + 'cphalcon:Compiler/FunctionCallTest#36' => '{{ "abc" | left_trim }}', + 'cphalcon:Compiler/FunctionCallTest#37' => '{{ "abc" | right_trim }}', + 'cphalcon:Compiler/FunctionCallTest#38' => '{{ "abc" | striptags }}', + 'cphalcon:Compiler/FunctionCallTest#39' => '{{ "abc" | url_encode }}', + 'cphalcon:Compiler/FunctionCallTest#40' => '{{ "abc" | slashes }}', + 'cphalcon:Compiler/FunctionCallTest#41' => '{{ "abc" | stripslashes }}', + 'cphalcon:Compiler/FunctionCallTest#42' => '{{ "abc" | nl2br }}', + 'cphalcon:Compiler/FunctionCallTest#43' => '{{ "abc" | keys }}', + 'cphalcon:Compiler/FunctionCallTest#44' => '{{ ["abc", "def"] | join(",") }}', + 'cphalcon:Compiler/FunctionCallTest#45' => '{{ "abc" | lower }}', + 'cphalcon:Compiler/FunctionCallTest#46' => '{{ "abc" | lowercase }}', + 'cphalcon:Compiler/FunctionCallTest#47' => '{{ "abc" | upper }}', + 'cphalcon:Compiler/FunctionCallTest#48' => '{{ "abc" | uppercase }}', + 'cphalcon:Compiler/FunctionCallTest#49' => '{{ "abc" | capitalize }}', + 'cphalcon:Compiler/FunctionCallTest#50' => '{{ "abc" | sort }}', + 'cphalcon:Compiler/FunctionCallTest#51' => '{{ "abc" | json_encode }}', + 'cphalcon:Compiler/FunctionCallTest#52' => '{{ "abc" | json_decode }}', + 'cphalcon:Compiler/FunctionCallTest#53' => '{{ "abc" | format }}', + 'cphalcon:Compiler/FunctionCallTest#54' => '{{ "abc" | abs }}', + 'cphalcon:Compiler/FunctionCallTest#55' => '{{ "abc" | slice }}', + 'cphalcon:Compiler/FunctionCallTest#56' => '{{ "abc" | default("def") }}', + 'cphalcon:Compiler/FunctionCallTest#57' => '{{ "abc" | convert_encoding }}', + 'cphalcon:Compiler/FunctionCallTest#58' => '{{ a("https://phalcon.io/", "home") }}', + 'cphalcon:Compiler/FunctionCallTest#59' => '{{ base("https://phalcon.io/") }}', + 'cphalcon:Compiler/FunctionCallTest#60' => '{{ body() }}', + 'cphalcon:Compiler/FunctionCallTest#61' => '{{ button("close", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#62' => '{{ close("form") }}', + 'cphalcon:Compiler/FunctionCallTest#63' => '{{ doctype(5, "\\n\\n") }}', + 'cphalcon:Compiler/FunctionCallTest#64' => '{{ element("button", "close", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#65' => '{{ form(["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#66' => '{{ img("/img/abc.jpg") }}', + 'cphalcon:Compiler/FunctionCallTest#67' => '{{ inputCheckbox("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#68' => '{{ inputColor("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#69' => '{{ inputDate("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#70' => '{{ inputDateTime("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#71' => '{{ inputDateTimeLocal("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#72' => '{{ inputEmail("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#73' => '{{ inputFile("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#74' => '{{ inputHidden("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#75' => '{{ inputImage("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#76' => '{{ inputInput("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#77' => '{{ inputMonth("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#78' => '{{ inputNumeric("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#79' => '{{ inputPassword("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#80' => '{{ inputRadio("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#81' => '{{ inputRange("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#82' => '{{ inputSearch("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#83' => '{{ inputSelect("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#84' => '{{ inputSubmit("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#85' => '{{ inputTel("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#86' => '{{ inputText("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#87' => '{{ inputTextarea("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#88' => '{{ inputTime("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#89' => '{{ inputUrl("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#90' => '{{ inputWeek("test", "1", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#91' => '{{ label("test", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#92' => '{{ link("\\t", "\\n\\n") }}', + 'cphalcon:Compiler/FunctionCallTest#93' => '{{ meta("\\t", "\\n\\n") }}', + 'cphalcon:Compiler/FunctionCallTest#94' => '{{ ol("test", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/FunctionCallTest#95' => '{{ script("\\t", "\\n\\n") }}', + 'cphalcon:Compiler/FunctionCallTest#96' => '{{ style("\\t", "\\n\\n") }}', + 'cphalcon:Compiler/FunctionCallTest#97' => '{{ title("\\t", "\\n\\n") }}', + 'cphalcon:Compiler/FunctionCallTest#98' => '{{ ul("test", ["class" : "label label-info"]) }}', + 'cphalcon:Compiler/ParseTest#1' => '{{ "hello"}}{% extends "some/file.volt" %}', + 'cphalcon:Compiler/ParseTest#2' => '
{% extends "some/file.volt" %}{% set a = 1 %}
', + 'cphalcon:Compiler/ParseTest#3' => '{% extends "some/file.volt" %}{{ "hello"}}', + 'cphalcon:Compiler/ParseTest#4' => '{% extends "some/file.volt" %}{{% if true %}} {%endif%}', + 'cphalcon:Compiler/ParseTest#5' => '{% extends "some/file.volt" %}{{% set a = 1 %}', + 'cphalcon:Compiler/ParseTest#6' => '{{ 1 }}', + 'cphalcon:Compiler/ParseTest#7' => '{{ 1.2 }}', + 'cphalcon:Compiler/ParseTest#8' => '{{ false }}', + 'cphalcon:Compiler/ParseTest#9' => '{{ true }}', + 'cphalcon:Compiler/ParseTest#10' => '{{ null }}', + 'cphalcon:Compiler/ParseTest#11' => '{{ "\'hello\'" }}', + 'cphalcon:Compiler/ParseTest#12' => '{{ a[0 ][1]}}', + 'cphalcon:Compiler/ParseTest#13' => '{{ a[0]["hello"] }}', + 'cphalcon:Compiler/ParseTest#14' => '{{ a[0][1.2][false][true] }}', + 'cphalcon:Compiler/ParseTest#15' => '{{ a[0][1.2][false][true][b] }}', + 'cphalcon:Compiler/ParseTest#16' => '{{ (a.b).c }}', + 'cphalcon:Compiler/ParseTest#17' => '{{ a.(b.c) }}', + 'cphalcon:Compiler/ParseTest#18' => '{{ 10-- }}', + 'cphalcon:Compiler/ParseTest#19' => '{{ !!10 }}', + 'cphalcon:Compiler/ParseTest#20' => '{{ contents() }}', + 'cphalcon:Compiler/ParseTest#21' => '{{ form(\'action\': \'save/products\', \'method\': \'post\') }}', + 'cphalcon:Compiler/ParseTest#22' => '{{ form(\'action\': \'save/products\', \'method\': other_func(1, 2, 3)) }}', + 'cphalcon:Compiler/ParseTest#23' => '{{ flash.outputMessages() }}', + 'cphalcon:Compiler/ParseTest#24' => '{{ session.get(\'hello\') }}', + 'cphalcon:Compiler/ParseTest#25' => '{{ user.session.get(\'hello\') }}', + 'cphalcon:Compiler/ParseTest#26' => '{{ user.session.get(request.getPost(\'token\')) }}', + 'cphalcon:Compiler/ParseTest#27' => '{{ a[0](\'hello\') }}', + 'cphalcon:Compiler/ParseTest#28' => '{{ [a[0](\'hello\').name]|keys }}', + 'cphalcon:Compiler/ParseTest#29' => '{{ [1, 2, 3, 4] }}', + 'cphalcon:Compiler/ParseTest#30' => '{{ ["hello", 2, 1.3, false, true, null] }}', + 'cphalcon:Compiler/ParseTest#31' => '{{ ["hello", 2, 3, false, true, null, [1, 2, "hola"]] }}', + 'cphalcon:Compiler/ParseTest#32' => '{{ [\'first\': 1, \'second\': 2, \'third\': 3] }}', + 'cphalcon:Compiler/ParseTest#33' => '{{ (("hello" ~ "lol")|e|length)|trim }}', + 'cphalcon:Compiler/ParseTest#34' => '{{ "a".."z"|join(",") }}', + 'cphalcon:Compiler/ParseTest#35' => '{{ "My real name is %s"|format(name) }}', + 'cphalcon:Compiler/ParseTest#36' => '{{ robot.price|default(10.0) }}', + 'cphalcon:Compiler/ParseTest#37' => '{% if a and b %} hello {% endif %}', + 'cphalcon:Compiler/ParseTest#38' => '{% if a or b %} hello {% endif %}', + 'cphalcon:Compiler/ParseTest#39' => '{% if a is 100 %} hello {% endif %}', + 'cphalcon:Compiler/ParseTest#40' => '{% if a is not 100 %} hello {% endif %}', + 'cphalcon:Compiler/ParseTest#41' => '{% for a in 1..10 if a < 5 and a > 7 %} hello {% endfor %}', + 'cphalcon:Compiler/ParseTest#42' => '{% for k, v in [1, 2, 3] %} hello {% endfor %}', + 'cphalcon:Compiler/ParseTest#43' => '{% for k, v in [1, 2, 3] if v is odd %} hello {% endfor %}', + 'cphalcon:Compiler/ParseTest#44' => '{% for v in [1, 2, 3] %} {% break %} {% endfor %}', + 'cphalcon:Compiler/ParseTest#45' => '{% for v in [1, 2] %} {% continue %} {% endfor %}', + 'cphalcon:Compiler/ParseTest#46' => '{% set a = b %}', + 'cphalcon:Compiler/ParseTest#47' => '{% set a[0] = 1 %}', + 'cphalcon:Compiler/ParseTest#48' => '{% set a[0][1] = 1 %}', + 'cphalcon:Compiler/ParseTest#49' => '{% set a.y = 1 %}', + 'cphalcon:Compiler/ParseTest#50' => '{% set a.y.x = 1 %}', + 'cphalcon:Compiler/ParseTest#51' => '{% set a[0].y = 1 %}', + 'cphalcon:Compiler/ParseTest#52' => '{% set a.y[0] = 1 %}', + 'cphalcon:Compiler/ParseTest#53' => '{% do 1 %}', + 'cphalcon:Compiler/ParseTest#54' => '{% do a + b %}', + 'cphalcon:Compiler/ParseTest#55' => '{% do a - 1.2 %}', + 'cphalcon:Compiler/ParseTest#56' => '{% do 1.2 + 1 * (20 / b) and c %}', + 'cphalcon:Compiler/ParseTest#57' => '{% do super()|e %}', + 'cphalcon:Compiler/ParseTest#58' => '{% autoescape true %} {% endautoescape %}', + 'cphalcon:Compiler/ParseTest#59' => '{% autoescape false %} {% endautoescape %}', + 'cphalcon:Compiler/ParseTest#60' => '{% block hello %} {% endblock %}', + 'cphalcon:Compiler/ParseTest#61' => '{% block hello %}{% endblock %}', + 'cphalcon:Compiler/ParseTest#62' => '{% extends "some/file.volt" %}', + 'cphalcon:Compiler/ParseTest#63' => '{% include "some/file.volt" %}', + 'cphalcon:Compiler/ParseTest#64' => '{{ cookie().set(\'key\', \'value\') }}', + 'cphalcon:Compiler/ParseTest#65' => '{{ test.is() }}', + 'cphalcon:Compiler/ParseTest#66' => '{{ test.is(true) }}', + 'cphalcon:Compiler/ParseTest#67' => '{{ cookie().is(true) }}', + 'cphalcon:Compiler/ParseTest#68' => '{{', + 'cphalcon:Compiler/ParseTest#69' => '{{ }}', + 'cphalcon:Compiler/ParseTest#70' => '{{ ++v }}', + 'cphalcon:Compiler/ParseTest#71' => '{{ + ++v }}', + 'cphalcon:Compiler/ParseTest#72' => '{{ + + + if + for }}', + 'cphalcon:Compiler/ParseTest#73' => '{% block some %} + {% for x in y %} + {{ ."hello".y }} + {% endfor %} + {% endblock %}', + 'cphalcon:Compiler/ParseTest#74' => '{# + + This is a multi-line comment + + #}{% block some %} + {# This is a single-line comment #} + {% for x in y %} + {{ "hello"++y }} + {% endfor %} + {% endblock %}', + 'cphalcon:Compiler/ParseTest#75' => '{# Hello #} + + {% for robot in robots %} + {{ link_to("hello", robot.id ~ ~ robot.name) }} + {% endfor %} + + ', + 'cphalcon:Compiler/ParseTest#76' => '\'{{ link_to("album/" ~ album.id ~ "/" ~ $album.uri, "\\""") }}\'', + 'cphalcon:Compiler/ResolveTest#1' => '{% if a is empty %} yes {% endif %}', + 'cphalcon:Compiler/ResolveTest#2' => '{% if a is even %} yes {% endif %}', + 'cphalcon:Compiler/ResolveTest#3' => '{% if a is odd %} yes {% endif %}', + 'cphalcon:Compiler/ResolveTest#4' => '{% if a is numeric %} yes {% endif %}', + 'cphalcon:Compiler/ResolveTest#5' => '{% if a is defined %} yes {% endif %}', + 'cphalcon:CompilerFilesTest#1' => '{% extends "', + 'cphalcon:CompilerFilesTest#2' => '" %}{% block content %}absolute{% endblock %}', + 'cphalcon:CompilerTest#1' => '{{song}} {{song}}', + 'cphalcon:CompilerTest#2' => 'Two songs: {{song}} {{song}}', + 'cphalcon:CompilerTest#3' => '{% for i in 1..5 %}{{ loop.self.index }}{% endfor %}', + 'cphalcon:Parser/AccessTest#1' => '{{ items[0] }}', + 'cphalcon:Parser/AccessTest#2' => '{{ map[\'key\'] }}', + 'cphalcon:Parser/AccessTest#3' => '{{ items[index] }}', + 'cphalcon:Parser/AccessTest#4' => '{{ user.name }}', + 'cphalcon:Parser/AccessTest#5' => '{{ user.address.city }}', + 'cphalcon:Parser/ArithmeticTest#1' => '{{ 1 + 2 }}', + 'cphalcon:Parser/ArithmeticTest#2' => '{{ value-- }}', + 'cphalcon:Parser/ArithmeticTest#3' => '{{ 10 / 2 }}', + 'cphalcon:Parser/ArithmeticTest#4' => '{{ value++ }}', + 'cphalcon:Parser/ArithmeticTest#5' => '{{ 10 / / 3 }}', + 'cphalcon:Parser/ArithmeticTest#6' => '{{ 10 % 3 }}', + 'cphalcon:Parser/ArithmeticTest#7' => '{{ 4 * 3 }}', + 'cphalcon:Parser/ArithmeticTest#8' => '{{ 2 * * 8 }}', + 'cphalcon:Parser/ArithmeticTest#9' => '{{ 5 - 3 }}', + 'cphalcon:Parser/ArithmeticTest#10' => '{{ -value }}', + 'cphalcon:Parser/ArithmeticTest#11' => '{{ +value }}', + 'cphalcon:Parser/ArrayTest#1' => '{{ [] }}', + 'cphalcon:Parser/ArrayTest#2' => '{{ [1, 2, 3] }}', + 'cphalcon:Parser/ArrayTest#3' => '{{ [\'a\', \'b\', \'c\'] }}', + 'cphalcon:Parser/ArrayTest#4' => '{{ {} }}', + 'cphalcon:Parser/ArrayTest#5' => '{{ {\'key\': \'value\', \'num\': 42} }}', + 'cphalcon:Parser/AutoescapeTest#1' => '{% autoescape false %}{{ html }}{% endautoescape %}', + 'cphalcon:Parser/AutoescapeTest#2' => '{% autoescape true %}{{ name }}{% endautoescape %}', + 'cphalcon:Parser/BlockTest#1' => '{% block sidebar %}{% endblock %}', + 'cphalcon:Parser/BlockTest#2' => '{% block content %}Default content{% endblock %}', + 'cphalcon:Parser/CallTest#1' => '{% call myMacro() %}{% endcall %}', + 'cphalcon:Parser/CallTest#2' => '{% call render(item) %}block content{% endcall %}', + 'cphalcon:Parser/CommentTest#1' => '{# This is a comment #}', + 'cphalcon:Parser/CommentTest#2' => 'Hello {# greeting comment #} World', + 'cphalcon:Parser/ComparisonTest#1' => '{{ a == b }}', + 'cphalcon:Parser/ComparisonTest#2' => '{{ a > b }}', + 'cphalcon:Parser/ComparisonTest#3' => '{{ a >= b }}', + 'cphalcon:Parser/ComparisonTest#4' => '{{ a === b }}', + 'cphalcon:Parser/ComparisonTest#5' => '{{ a < b }}', + 'cphalcon:Parser/ComparisonTest#6' => '{{ a <= b }}', + 'cphalcon:Parser/ComparisonTest#7' => '{{ a != b }}', + 'cphalcon:Parser/ComparisonTest#8' => '{{ a <> b }}', + 'cphalcon:Parser/ComparisonTest#9' => '{{ a !== b }}', + 'cphalcon:Parser/ConcatenationTest#1' => '{{ \'Hello\' ~ \' \' ~ \'World\' }}', + 'cphalcon:Parser/ConcatenationTest#2' => '{{ firstName ~ \' \' ~ lastName }}', + 'cphalcon:Parser/DoTest#1' => '{% do myFunction() %}', + 'cphalcon:Parser/DoTest#2' => '{% do object.method(arg) %}', + 'cphalcon:Parser/EchoTest#1' => '{{ 3.14 }}', + 'cphalcon:Parser/EchoTest#2' => '{{ 42 }}', + 'cphalcon:Parser/EchoTest#3' => '{{ "Hello" }}', + 'cphalcon:Parser/EchoTest#4' => '{{ "say \\"hi\\"" }}', + 'cphalcon:Parser/EchoTest#5' => '{{ \'Hello\' }}', + 'cphalcon:Parser/EchoTest#6' => '{{- name -}}', + 'cphalcon:Parser/EchoTest#7' => '{{- name }}', + 'cphalcon:Parser/EchoTest#8' => '{{ name -}}', + 'cphalcon:Parser/EchoTest#9' => '{{ name }}', + 'cphalcon:Parser/ExtendsTest#1' => '{% extends \'base.volt\' %}', + 'cphalcon:Parser/ExtendsTest#2' => '{% extends layout %}', + 'cphalcon:Parser/FilterTest#1' => '{{ name | upper }}', + 'cphalcon:Parser/FilterTest#2' => '{{ name | upper | trim }}', + 'cphalcon:Parser/ForTest#1' => '{% for item in items %}{{ item }}{% elsefor %}No items{% endfor %}', + 'cphalcon:Parser/ForTest#2' => '{% for item in items if item.active %}{{ item.name }}{% endfor %}', + 'cphalcon:Parser/ForTest#3' => '{% for key, value in map %}{{ key }}: {{ value }}{% endfor %}', + 'cphalcon:Parser/ForTest#4' => '{% for key, value in map if value > 0 %}{{ key }}{% endfor %}', + 'cphalcon:Parser/FunctionCallTest#1' => '{{ slice(text, 0, 50) }}', + 'cphalcon:Parser/FunctionCallTest#2' => '{{ myFunc(\'key\': value) }}', + 'cphalcon:Parser/FunctionCallTest#3' => '{{ myFunc() }}', + 'cphalcon:Parser/FunctionCallTest#4' => '{{ upper(name) }}', + 'cphalcon:Parser/FunctionCallTest#5' => '{{ (1 + 2) * 3 }}', + 'cphalcon:Parser/IfTest#1' => '{% if active %}Yes{% else %}No{% endif %}', + 'cphalcon:Parser/IfTest#2' => '{% if status == 1 %}Active{% elseif status == 0 %}Inactive{% endif %}', + 'cphalcon:Parser/IfTest#3' => '{% if status == 1 %}Active{% elseif status == 2 %}Pending{% else %}Unknown{% endif %}', + 'cphalcon:Parser/IfTest#4' => '{% if condition %}{% endif %}', + 'cphalcon:Parser/IfTest#5' => '{% if active %}Yes{% endif %}', + 'cphalcon:Parser/InTest#1' => '{{ item in collection }}', + 'cphalcon:Parser/InTest#2' => '{{ item not in collection }}', + 'cphalcon:Parser/IncludeTest#1' => '{% include \'partial.volt\' %}', + 'cphalcon:Parser/IncludeTest#2' => '{% include \'partial.volt\' with vars %}', + 'cphalcon:Parser/IncludeTest#3' => '{% include \'partial.volt\' with {\'key\': \'value\'} %}', + 'cphalcon:Parser/IsTest#1' => '{% if a is b %}c{% endif %}', + 'cphalcon:Parser/IsTest#2' => '{{ var is defined }}', + 'cphalcon:Parser/IsTest#3' => '{{ var is empty }}', + 'cphalcon:Parser/IsTest#4' => '{{ title is empty ? siteName : title }}', + 'cphalcon:Parser/IsTest#5' => '{{ number is even }}', + 'cphalcon:Parser/IsTest#6' => '{{ var is iterable }}', + 'cphalcon:Parser/IsTest#7' => '{% if a is not b %}c{% endif %}', + 'cphalcon:Parser/IsTest#8' => '{{ var is not defined }}', + 'cphalcon:Parser/IsTest#9' => '{{ var is not empty }}', + 'cphalcon:Parser/IsTest#10' => '{{ number is not even }}', + 'cphalcon:Parser/IsTest#11' => '{{ var is not iterable }}', + 'cphalcon:Parser/IsTest#12' => '{{ var is not numeric }}', + 'cphalcon:Parser/IsTest#13' => '{{ number is not odd }}', + 'cphalcon:Parser/IsTest#14' => '{{ var is not scalar }}', + 'cphalcon:Parser/IsTest#15' => '{{ var is numeric }}', + 'cphalcon:Parser/IsTest#16' => '{{ number is odd }}', + 'cphalcon:Parser/IsTest#17' => '{{ var is scalar }}', + 'cphalcon:Parser/IsTest#18' => '{{ uploadedPhoto is user.avatar ? \'checked="checked"\' : \'\' }}', + 'cphalcon:Parser/LogicalTest#1' => '{{ a and b }}', + 'cphalcon:Parser/LogicalTest#2' => '{{ a or b }}', + 'cphalcon:Parser/LoopControlTest#1' => '{% for item in items %}{% if item.skip %}{% break %}{% endif %}{{ item }}{% endfor %}', + 'cphalcon:Parser/LoopControlTest#2' => '{% for item in items %}{% if item.skip %}{% continue %}{% endif %}{{ item }}{% endfor %}', + 'cphalcon:Parser/MacroTest#1' => '{% macro show(visible = false) %}{{ visible }}{% endmacro %}', + 'cphalcon:Parser/MacroTest#2' => '{% macro repeat(times = 1) %}{{ times }}{% endmacro %}', + 'cphalcon:Parser/MacroTest#3' => '{% macro render(item = null) %}{{ item }}{% endmacro %}', + 'cphalcon:Parser/MacroTest#4' => '{% macro greet(name = \'World\') %}Hello {{ name }}{% endmacro %}', + 'cphalcon:Parser/MacroTest#5' => '{% macro show(visible = true) %}{{ visible }}{% endmacro %}', + 'cphalcon:Parser/MacroTest#6' => '{% macro input(name, value) %}{% endmacro %}', + 'cphalcon:Parser/MacroTest#7' => '{% macro myMacro() %}content{% endmacro %}', + 'cphalcon:Parser/MacroTest#8' => '{% macro greet(name) %}Hello {{ name }}{% endmacro %}', + 'cphalcon:Parser/RangeTest#1' => '{{ 1..10 }}', + 'cphalcon:Parser/RangeTest#2' => '{{ start..end }}', + 'cphalcon:Parser/ReturnTest#1' => '{% return value %}', + 'cphalcon:Parser/ReturnTest#2' => '{% return a + b %}', + 'cphalcon:Parser/SetTest#1' => '{% set counter += 1 %}', + 'cphalcon:Parser/SetTest#2' => '{% set items[0] = \'first\' %}', + 'cphalcon:Parser/SetTest#3' => '{% set name = \'John\' %}', + 'cphalcon:Parser/SetTest#4' => '{% set total = price * qty %}', + 'cphalcon:Parser/SetTest#5' => '{% set value /= 2 %}', + 'cphalcon:Parser/SetTest#6' => '{% set user.name = \'John\' %}', + 'cphalcon:Parser/SetTest#7' => '{% set myVar = someVar is defined ? \'yes\' : \'no\' %}', + 'cphalcon:Parser/SetTest#8' => '{% set value *= 2 %}', + 'cphalcon:Parser/SetTest#9' => '{% set a = 1, b = 2, c = 3 %}', + 'cphalcon:Parser/SetTest#10' => '{% set counter -= 1 %}', + 'cphalcon:Parser/SetTest#11' => '{%- set defaultClass = \'form-control \' -%}', + 'cphalcon:Parser/SliceTest#1' => '{{ items[1:3] }}', + 'cphalcon:Parser/SliceTest#2' => '{{ items[2:] }}', + 'cphalcon:Parser/SliceTest#3' => '{{ items[:4] }}', + 'cphalcon:Parser/StackOverflowTest#1' => '{{ ', + 'cphalcon:Parser/SwitchTest#1' => '{% switch foo %}', + 'cphalcon:Parser/SwitchTest#2' => '{% case foo %}', + 'cphalcon:Parser/SwitchTest#3' => '{% default %}', + 'cphalcon:Parser/SwitchTest#4' => '{% switch foo %} + {% switch %} + {% endswitch %} +{% endswitch %}', + 'cphalcon:Parser/SwitchTest#5' => '{% switch %} + {% case foo %} + {% break %} +{% endswitch %}', + 'cphalcon:Parser/SwitchTest#6' => '{% switch status %}{% case 1 %}Active{% case 2 %}Pending{% default %}Unknown{% endswitch %}', + 'cphalcon:Parser/SwitchTest#7' => '{% switch x %}{% case 1 %}{{ false|default(\'simple text\') }}{% break %}{% endswitch %}', + 'cphalcon:Parser/SwitchTest#8' => '{% switch x %}{% default %}{{ value|default(\'unknown\') }}{% endswitch %}', + 'cphalcon:Parser/SwitchTest#9' => '{% switch status %}{% endswitch %}', + 'cphalcon:Parser/SwitchTest#10' => '{% switch foo%} {% case foo %} {% endswitch%}', + 'cphalcon:Parser/SwitchTest#11' => '{% switch foo%} {% case foo %} {% default %} {% endswitch%}', + 'cphalcon:Parser/SwitchTest#12' => '{% switch username %} + {% case "Jim" %} + Hello username + {% case "Nik" %} + {{ username }}! + {% break %} + {% default %} + Who are you? +{% endswitch %}', + 'cphalcon:Parser/TernaryTest#1' => '{{ condition ? \'yes\' : \'no\' }}', + 'cphalcon:Parser/TernaryTest#2' => '{{ someVar is defined ? \'yes\' : \'no\' }}', + 'cphalcon:Parser/TernaryTest#3' => '{{ active ? activeLabel : inactiveLabel }}', + 'cphalcon:VerbatimTest#1' => '{% verbatim %}{{ foo }}{% endverbatim %}', + 'cphalcon:VerbatimTest#2' => '{{ foo }}', + 'cphalcon:VerbatimTest#3' => '{% verbatim %}{% if x %}literal{% endif %}{% endverbatim %}', + 'cphalcon:VerbatimTest#4' => '{% if x %}literal{% endif %}', + 'cphalcon:VerbatimTest#5' => '{% verbatim %}{# not a comment #}{% endverbatim %}', + 'cphalcon:VerbatimTest#6' => '{# not a comment #}', + 'cphalcon:VerbatimTest#7' => '{% verbatim %}{{ keep {{ }} }}{% endverbatim %}', + 'cphalcon:VerbatimTest#8' => '{{ keep {{ }} }}', + 'cphalcon:VerbatimTest#9' => 'a {{ "b" }} {% verbatim %}{{ c }}{% endverbatim %} d', + 'cphalcon:VerbatimTest#10' => '{% verbatim %}{% endverbatim %}', + 'cphalcon-views:blocks/base.volt' => ' + + + + + + +{% block header %} +{{ partial(\'blocks/partials/header\') }} +{% endblock %} + +{% block mainContent %}{% endblock %} + + + +', + 'cphalcon-views:blocks/index/login.volt' => '{% extends \'base.volt\' %} + +{% block header %}{% endblock %} +{% block mainContent %} +

This is the login page

+{% endblock %} +{% block footer %}{% endblock %} +', + 'cphalcon-views:blocks/index/main.volt' => '{% extends \'base.volt\' %} + +{% block mainContent %} +

This is the main page

+{% endblock %} +', + 'cphalcon-views:builtinfunction/index.volt' => 'Length Array: {{ arr|length }} +Length Object: {{ obj|length }} +Length String: {{ str|length }} +Length No String: {{ no_str|length }} +Slice Array: {{ arr[0:]|join(\',\') }} +Slice Array: {{ arr[1:2]|join(\',\') }} +Slice Array: {{ arr[0:2]|join(\',\') }} +Slice Object: {{ obj[1:]|join(\',\') }} +Slice Object: {{ obj[1:2]|join(\',\') }} +Slice Object: {{ obj[0:1]|join(\',\') }} +Slice String: {{ "hello"[0:2] }} +Slice String: {{ "hello"[1:2] }} +Slice String: {{ "hello"[2:] }} +Slice No String: {{ 1234[0:2] }} +Slice No String: {{ 1234[1:2] }} +Slice No String: {{ 1234[2:] }} +', + 'cphalcon-views:compiler/children.extends.volt' => '{% extends "compiler/parent.volt" %} + +{% block title %}Index{% endblock %} + +{% block head %}{% endblock %} + +{% block content %}

Index

Welcome on my awesome homepage.

{% endblock %} +', + 'cphalcon-views:compiler/children.volt' => '{% extends "tests/support/assets/views/compiler/parent.volt" %} + +{% block title %}Index{% endblock %} + +{% block head %}{% endblock %} + +{% block content %}

Index

Welcome on my awesome homepage.

{% endblock %} +', + 'cphalcon-views:compiler/children2.volt' => '{% extends "tests/support/assets/views/compiler/parent.volt" %} + +{% block title %}Index{% endblock %} + +{% block head %} {{ super() }} {% endblock %} + +{% block content %}

Index

Welcome to my awesome homepage.

{% endblock %} + +{% block footer %}{{ super() }}{% endblock %} +', + 'cphalcon-views:compiler/import.volt' => '
{% include "partials/header.volt" %}
', + 'cphalcon-views:compiler/import2.volt' => '
{% include "partials/header2.volt" %}
', + 'cphalcon-views:compiler/index.volt' => 'Hello {{ song }}!', + 'cphalcon-views:compiler/parent.volt' => '{% block head %}{% endblock %}{% block title %}{% endblock %} - My Webpage
{% block content %}{% endblock %}
', + 'cphalcon-views:compiler/partial.volt' => 'Some label: {{ some_var }}', + 'cphalcon-views:currentrender/subobject.volt' => '{{ parentObject.child.getValue() }} +', + 'cphalcon-views:extends/children.extends.volt' => '{% extends "extends/parent.volt" %} + +{% block title %}Index{% endblock %} + +{% block head %}{% endblock %} + +{% block content %}

Index

Welcome on my awesome homepage.

{% endblock %} +', + 'cphalcon-views:extends/children.volt' => '{% extends "tests/support/assets/views/extends/parent.volt" %} + +{% block title %}Index{% endblock %} + +{% block head %}{% endblock %} + +{% block content %}

Index

Welcome on my awesome homepage.

{% endblock %} +', + 'cphalcon-views:extends/children2.volt' => '{% extends "tests/support/assets/views/extends/parent.volt" %} + +{% block title %}Index{% endblock %} + +{% block head %} {{ super() }} {% endblock %} + +{% block content %}

Index

Welcome to my awesome homepage.

{% endblock %} + +{% block footer %}{{ super() }}{% endblock %} +', + 'cphalcon-views:extends/nested/base.volt' => '{% block content %}{% endblock %}', + 'cphalcon-views:extends/nested/leaf.volt' => '{% extends "extends/nested/sub.volt" %}', + 'cphalcon-views:extends/nested/mid.volt' => '{% extends "extends/nested/base.volt" %}{% block content %}{{ partial("body") }} MID {% endblock %}', + 'cphalcon-views:extends/nested/sub.volt' => '{% extends "extends/nested/mid.volt" %}', + 'cphalcon-views:extends/themes/theme-a/child.volt' => '{% extends "../theme-b/base.volt" %}{% block content %}overridden{% endblock %}', + 'cphalcon-views:extends/themes/theme-b/base.volt' => '{% block content %}base{% endblock %}', + 'cphalcon-views:filters/default.volt' => '{{ robot.price|default(10.0) }} +', + 'cphalcon-views:filters/default_json_encode.volt' => '{{ preparedParams|default([])|json_encode }} +', + 'cphalcon-views:layouts/compiler.volt' => '{% if some_eval %} +Clearly, the song is: {{ content() }}. +{% endif %}', + 'cphalcon-views:macro/conditionaldate.volt' => '{%- macro conditionaldate(condition, tdate, ttime, tz) -%} + {%- if condition -%} from
{{ tdate }}, {{ ttime }} {{ tz }}{%- endif -%} +{%- endmacro -%} + +{%- set tdate = date(\'Y-m-d\') -%} +{%- set ttime = date(\'H:i\') -%} +{%- set tz = \'UTC\' -%} + +{{- conditionaldate(true, tdate, ttime, tz) -}} +', + 'cphalcon-views:macro/error_messages.volt' => '{%- macro error_messages(message, field, type) -%} +
{{ type }}{{ field }}{{ message }}
+{%- endmacro -%} + +{{- error_messages(\'type\': \'Invalid\', \'message\': \'The name is invalid\', \'field\': \'name\') -}} +', + 'cphalcon-views:macro/form_row.volt' => '{%- macro formRow(form, tag, attributes = \'\', col = 6) -%} + {%- set defaultClass = \'form-control \' -%} + + {%- if attributes is iterable -%} + {%- for key, value in attributes -%} + {%- set attr[key] = value -%} + {%-endfor -%} + {%- else -%} + {%- set attr[\'class\'] = defaultClass ~ attributes -%} + {%-endif -%} + +
+ +
{{ form.render(tag, attr) }}
+
+{%- endmacro -%} + + +{{- formRow(formLogin, \'password\') -}} +', + 'cphalcon-views:macro/hello.volt' => '{%- macro hello(name) -%} + {%- return "Hello " ~ name -%} +{%- endmacro -%} + +{{- hello(\'World\') -}} +', + 'cphalcon-views:macro/list.volt' => '{%- macro list(var) -%} + {{- dump(var) -}} +{%- endmacro -%} + +{{- list(object) -}} +', + 'cphalcon-views:macro/my_input.volt' => '{%- macro my_input(name, class="input-text") -%} + {%- return inputText(name, null, [\'class\': class]) -%} +{%- endmacro -%} + +{{- \'

\' ~ my_input(\'name\') ~ \'

\' -}} +', + 'cphalcon-views:macro/null-value.volt' => '{%- macro print(object) -%} + {{- \'Not Null: \' ~ object.notNullValue ~ \' - Null: \' ~ object.nullValue -}} +{%- endmacro -%} + +{{- print(object) -}} +', + 'cphalcon-views:macro/related_links.volt' => '{%- macro related_bar(related_links) -%} + +{%- endmacro -%} + +{{- related_bar(links) -}} +', + 'cphalcon-views:macro/strtotime.volt' => '{{- date.getTimeStamp() -}} % {{- strtotime(\'now\') -}} % {{- strtotime(date.format(\'Y-m-d H:i:s\')) -}} +', + 'cphalcon-views:partials/header2.volt' => '

{% include "partials/header3.volt" %}

', + 'cphalcon-views:switch-case/simple-usage.volt' => '{% switch username %} + {% case "Jim" %} + Hello username + {% case "Nik" %} + {{ username }}! + {% break %} + {% default %} + Who are you? +{% endswitch %} +', + 'cphalcon-views:templates/a.volt' => '[A[{% block body %}{% endblock %}]] +', + 'cphalcon-views:templates/b.volt' => '{% extends \'tests/support/assets/views/templates/a.volt\' %}{% block body %}[B]{% endblock %} +', + 'cphalcon-views:templates/c.volt' => '{% extends \'tests/support/assets/views/templates/b.volt\' %}{% block body %}###{{ super() }}###{% endblock %} +', + 'phalcon:Compiler/CompileCallTest#1' => '{% call m(1) %}BODY{% endcall %}', + 'phalcon:Compiler/CompileTest#1' => '

{% block a %}PA{% endblock %}

', + 'phalcon:Compiler/CompileTest#2' => '

{% block a %}NEW{% endblock %}

', + 'phalcon:Compiler/CompileTest#3' => '

{% block a %}PA{% endblock %}|{% block b %}PB{% endblock %}

', + 'phalcon:Compiler/CompileTest#4' => 'layout.volt\' %}{% block a %}ONE{% endblock %}', + 'phalcon:Compiler/CompileTest#5' => 'layout.volt\' %}{% block b %}TWO{% endblock %}', + 'volt:Compiler/SetTest#1' => '{% set icon = \'\' %}', + 'volt:Parser/ParserTest#1' => '{% block outer %}{% block inner %}{% endblock %}{% endblock %}', + 'volt:Parser/ParserTest#2' => '{% call greet() %}{% endcall %}', + 'volt:Parser/ParserTest#3' => '{% case 1 %}', + 'volt:Parser/ParserTest#4' => '{{ {\'key\': \'value\'} }}', + 'volt:Parser/ParserTest#5' => '{% set counter /= 2 %}', + 'volt:Parser/ParserTest#6' => '{% for x in items %}{{ x }}{% elsefor %}empty{% endfor %}', + 'volt:Parser/ParserTest#7' => '{% for x in items %}{{ x }}{% else %}empty{% endfor %}', + 'volt:Parser/ParserTest#8' => '{% elseif x %}', + 'volt:Parser/ParserTest#9' => '{% endswitch %}', + 'volt:Parser/ParserTest#10' => '{% extends \'base.volt\' %}{% block content %}hello{% endblock %}', + 'volt:Parser/ParserTest#11' => '{% extends "base.volt" %}{% for x in y %}{% endfor %}', + 'volt:Parser/ParserTest#12' => '{% extends "base.volt" %}{% if x %}yes{% endif %}', + 'volt:Parser/ParserTest#13' => '{% if active %}yes{% endif %}', + 'volt:Parser/ParserTest#14' => '{% include "partial.volt" with vars %}', + 'volt:Parser/ParserTest#15' => '{% macro outer() %}{% macro inner() %}{% endmacro %}{% endmacro %}', + 'volt:Parser/ParserTest#16' => '{% set counter *= 2 %}', + 'volt:Parser/ParserTest#17' => '{% switch x %}{% switch y %}{% endswitch %}{% endswitch %}', + 'volt:Parser/ParserTest#18' => '{% extends "base.volt" %}{{ something }}', + 'volt:Parser/ParserTest#19' => '{% extends "base.volt" %}non-blank content', + 'volt:Parser/ParserTest#20' => '{% macro compute(x) %}{% return x %}{% endmacro %}', + 'volt:Parser/ParserTest#21' => '{{ link_to("album/" ~ album.id ~ "/" ~ $album.uri, "test") }}', + 'volt:Parser/ParserTest#22' => '{% extends "base.volt" %}{% set x = 1 %}', + 'volt:Parser/ParserTest#23' => '{% set x = 1 %}', + 'volt:Parser/ParserTest#24' => '{% extends "base.volt" %}{% switch x %}{% endswitch %}', + 'volt:Parser/ParserTest#25' => '{% switch x %}{% default %}fallback{% endswitch %}', + 'volt:Parser/ParserTest#26' => '{% endif %}', + 'volt:Scanner/OpcodeTest#1' => '{%', +); diff --git a/tests/fixtures/parity/lines.json b/tests/fixtures/parity/lines.json new file mode 100644 index 0000000..3ccb4eb --- /dev/null +++ b/tests/fixtures/parity/lines.json @@ -0,0 +1,35 @@ +{ + "generator": "ext-phalcon 5.23.0", + "cases": { + "if: multiline body": {"source":"{% if a %}\nx\n{% endif %}\ny","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"\nx\n","file":"eval code","line":3}],"file":"eval code","line":4},{"type":357,"value":"\ny","file":"eval code","line":4}]},"compile":{"outcome":"value","value":"\nx\n\ny"}}, + "if: elseif else multiline": {"source":"{% if a %}\n{% elseif b %}\n{% else %}\n{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"\n","file":"eval code","line":2},{"type":302,"expr":{"type":265,"value":"b","file":"eval code","line":2},"file":"eval code","line":3},{"type":357,"value":"\n","file":"eval code","line":3}],"false_statements":[{"type":357,"value":"\n","file":"eval code","line":4}],"file":"eval code","line":4}]},"compile":{"outcome":"value","value":"\n\n\n"}}, + "if: trailing newlines": {"source":"{% if a %}x{% endif %}\n\n\n","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":4},{"type":357,"value":"\n\n\n","file":"eval code","line":4}]},"compile":{"outcome":"value","value":"x\n\n\n"}}, + "echo: operands on lines": {"source":"{{ a\n+\nb }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":43,"left":{"type":265,"value":"a","file":"eval code","line":2},"right":{"type":265,"value":"b","file":"eval code","line":3},"file":"eval code","line":3},"file":"eval code","line":3}]},"compile":{"outcome":"value","value":""}}, + "echo: trailing newline": {"source":"{{ a }}\n","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":2},{"type":357,"value":"\n","file":"eval code","line":2}]},"compile":{"outcome":"value","value":"\n"}}, + "echo: trailing blank lines": {"source":"{{ a }}\n\n\n","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":4},{"type":357,"value":"\n\n\n","file":"eval code","line":4}]},"compile":{"outcome":"value","value":"\n\n\n"}}, + "echo: after raw lines": {"source":"text\n\n{{ a }}","parse":{"outcome":"value","value":[{"type":357,"value":"text\n\n","file":"eval code","line":3},{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":3},"file":"eval code","line":3}]},"compile":{"outcome":"value","value":"text\n\n"}}, + "echo: string with newline": {"source":"{{ 'multi\nline' }}\n{{ b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"multi\nline","file":"eval code","line":1},"file":"eval code","line":2},{"type":357,"value":"\n","file":"eval code","line":2},{"type":359,"expr":{"type":265,"value":"b","file":"eval code","line":2},"file":"eval code","line":2}]},"compile":{"outcome":"value","value":"\n"}}, + "echo: array on lines": {"source":"{{\n[\n1,\n2\n]\n}}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":3},"file":"eval code","line":3},{"expr":{"type":258,"value":"2","file":"eval code","line":5},"file":"eval code","line":5}],"file":"eval code","line":6},"file":"eval code","line":6}]},"compile":{"outcome":"value","value":""}}, + "echo: call args on lines": {"source":"{{ f(\na,\nb\n) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"a","file":"eval code","line":2},"file":"eval code","line":2},{"expr":{"type":265,"value":"b","file":"eval code","line":4},"file":"eval code","line":4}],"file":"eval code","line":4},"file":"eval code","line":4}]},"compile":{"outcome":"value","value":"callMacro('f', [$a, $b]) ?>"}}, + "for: blank lines": {"source":"{% for x in y %}\n\n{{ x }}\n\n{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"block_statements":[{"type":357,"value":"\n\n","file":"eval code","line":3},{"type":359,"expr":{"type":265,"value":"x","file":"eval code","line":3},"file":"eval code","line":5},{"type":357,"value":"\n\n","file":"eval code","line":5}],"file":"eval code","line":5}]},"compile":{"outcome":"value","value":"\n\n\n\n"}}, + "for: key value elsefor": {"source":"{% for k, v in y if v %}\n{{ k }}\n{% elsefor %}\nnone\n{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"v","key":"k","expr":{"type":265,"value":"y","file":"eval code","line":1},"if_expr":{"type":265,"value":"v","file":"eval code","line":1},"block_statements":[{"type":357,"value":"\n","file":"eval code","line":2},{"type":359,"expr":{"type":265,"value":"k","file":"eval code","line":2},"file":"eval code","line":3},{"type":357,"value":"\n","file":"eval code","line":3},{"type":321,"file":"eval code","line":5},{"type":357,"value":"\nnone\n","file":"eval code","line":5}],"file":"eval code","line":5}]},"compile":{"outcome":"value","value":" $v) { if ($v) { ?>\n\n\nnone\n"}}, + "switch: case followed by lines": {"source":"{% switch a %}\n{% case \"Jim\" %}\n\nfoo\n{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"a","file":"eval code","line":1},"case_clauses":[{"type":357,"value":"\n","file":"eval code","line":2},{"type":412,"expr":{"type":260,"value":"Jim","file":"eval code","line":2},"file":"eval code","line":5},{"type":357,"value":"\n\nfoo\n","file":"eval code","line":5}],"file":"eval code","line":5}]},"compile":{"outcome":"value","value":"\n\n\nfoo\n"}}, + "switch: default on lines": {"source":"{% switch a %}\n{% case 1 %}\none\n{% default %}\nother\n{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"a","file":"eval code","line":1},"case_clauses":[{"type":357,"value":"\n","file":"eval code","line":2},{"type":412,"expr":{"type":258,"value":"1","file":"eval code","line":2},"file":"eval code","line":4},{"type":357,"value":"\none\n","file":"eval code","line":4},{"type":413,"file":"eval code","line":6},{"type":357,"value":"\nother\n","file":"eval code","line":6}],"file":"eval code","line":6}]},"compile":{"outcome":"value","value":"\n\none\n\nother\n"}}, + "set: two statements": {"source":"{% set a = 1 %}\n{% set b = 2 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]},{"type":357,"value":"\n","file":"eval code","line":2},{"type":306,"assignments":[{"variable":{"type":265,"value":"b","file":"eval code","line":2},"op":61,"expr":{"type":258,"value":"2","file":"eval code","line":2},"file":"eval code","line":2}]}]},"compile":{"outcome":"value","value":"\n"}}, + "set: multi assignment lines": {"source":"{% set a = 1,\nb = 2,\nc = 3 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"variable":{"type":265,"value":"b","file":"eval code","line":2},"op":61,"expr":{"type":258,"value":"2","file":"eval code","line":2},"file":"eval code","line":2},{"variable":{"type":265,"value":"c","file":"eval code","line":3},"op":61,"expr":{"type":258,"value":"3","file":"eval code","line":3},"file":"eval code","line":3}]}]},"compile":{"outcome":"value","value":""}}, + "comment: before echo": {"source":"{# comment\n\n #}{{ a }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":3},"file":"eval code","line":3}]},"compile":{"outcome":"value","value":""}}, + "comment: between raw": {"source":"a\n{# c\n #}\nb{{ c }}","parse":{"outcome":"value","value":[{"type":357,"value":"a\n\nb","file":"eval code","line":4},{"type":359,"expr":{"type":265,"value":"c","file":"eval code","line":4},"file":"eval code","line":4}]},"compile":{"outcome":"value","value":"a\n\nb"}}, + "macro: params and body": {"source":"{% macro m(a, b = 1) %}\n{{ a }}\n{% endmacro %}","parse":{"outcome":"value","value":[{"type":322,"name":"m","parameters":[{"variable":"a","file":"eval code","line":1},{"variable":"b","default":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"block_statements":[{"type":357,"value":"\n","file":"eval code","line":2},{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":2},"file":"eval code","line":3},{"type":357,"value":"\n","file":"eval code","line":3}],"file":"eval code","line":3}]},"compile":{"outcome":"value","value":"macros['m'] = function($__p = null) { if (isset($__p[0])) { $a = $__p[0]; } else { if (array_key_exists(\"a\", $__p)) { $a = $__p[\"a\"]; } else { throw new \\Phalcon\\Mvc\\View\\Exception(\"Macro 'm' was called without parameter: a\"); } } if (isset($__p[1])) { $b = $__p[1]; } else { if (array_key_exists(\"b\", $__p)) { $b = $__p[\"b\"]; } else { $b = 1; } } ?>\n\nmacros['m'] = \\Closure::bind($this->macros['m'], $this); ?>"}}, + "block: empty then newline": {"source":"{% block b %}\n{% endblock %}\n","parse":{"outcome":"value","value":[{"type":307,"name":"b","block_statements":[{"type":357,"value":"\n","file":"eval code","line":2}],"file":"eval code","line":3},{"type":357,"value":"\n","file":"eval code","line":3}]},"compile":{"outcome":"value","value":"\n\n"}}, + "autoescape: body": {"source":"{% autoescape true %}\n{{ a }}\n{% endautoescape %}","parse":{"outcome":"value","value":[{"type":317,"enable":1,"block_statements":[{"type":357,"value":"\n","file":"eval code","line":2},{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":2},"file":"eval code","line":3},{"type":357,"value":"\n","file":"eval code","line":3}],"file":"eval code","line":3}]},"compile":{"outcome":"value","value":"\nescaper->html($a) ?>\n"}}, + "verbatim: body then newline": {"source":"{% verbatim %}\n{{ a }}\n{% endverbatim %}\n","parse":{"outcome":"value","value":[{"type":357,"value":"\n{{ a }}\n","file":"eval code","line":3},{"type":357,"value":"\n","file":"eval code","line":4}]},"compile":{"outcome":"value","value":"\n{{ a }}\n\n"}}, + "include: with then newline": {"source":"{% include 'a' with {'b': 1} %}\n","parse":{"outcome":"value","value":[{"type":313,"path":{"type":260,"value":"a","file":"eval code","line":1},"params":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"name":"b","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":2},{"type":357,"value":"\n","file":"eval code","line":2}]},"compile":{"outcome":"value","value":"partial('a', ['b' => 1]); ?>\n"}}, + "do: return on lines": {"source":"{% do a() %}\n\n{% return b %}","parse":{"outcome":"value","value":[{"type":316,"expr":{"type":350,"name":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":3},{"type":357,"value":"\n\n","file":"eval code","line":3},{"type":327,"expr":{"type":265,"value":"b","file":"eval code","line":3},"file":"eval code","line":3}]},"compile":{"outcome":"value","value":"callMacro('a', []); ?>\n\n"}}, + "whitespace control: lines": {"source":"{%- if a -%}\n x \n{%- endif -%}\n","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":3}],"file":"eval code","line":4}]},"compile":{"outcome":"value","value":"x"}}, + "call: body on lines": {"source":"{% call f(1) %}\nbody\n{% endcall %}\n","parse":{"outcome":"value","value":[{"type":325,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"caller":[{"type":357,"value":"\nbody\n","file":"eval code","line":3}],"file":"eval code","line":4},{"type":357,"value":"\n","file":"eval code","line":4}]},"compile":{"outcome":"value","value":"\n"}}, + "ternary: on lines": {"source":"{{ a\n?\nb\n:\nc }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":2},"left":{"type":265,"value":"b","file":"eval code","line":4},"right":{"type":265,"value":"c","file":"eval code","line":5},"file":"eval code","line":5},"file":"eval code","line":5}]},"compile":{"outcome":"value","value":""}}, + "filter: on lines": {"source":"{{ a\n|\nf\n}}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":265,"value":"a","file":"eval code","line":2},"right":{"type":265,"value":"f","file":"eval code","line":4},"file":"eval code","line":4},"file":"eval code","line":4}]},"compile":{"outcome":"throw","value":"Unknown filter \"f\" in eval code on line 4","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "raw only multiline": {"source":"a\nb\nc","parse":{"outcome":"value","value":[{"type":357,"value":"a\nb\nc","file":"eval code","line":3}]},"compile":{"outcome":"value","value":"a\nb\nc"}}, + "crlf raw and code": {"source":"a\r\n{{ b }}\r\n{% if c %}\r\nd\r\n{% endif %}","parse":{"outcome":"value","value":[{"type":357,"value":"a\r\n","file":"eval code","line":2},{"type":359,"expr":{"type":265,"value":"b","file":"eval code","line":2},"file":"eval code","line":3},{"type":357,"value":"\r\n","file":"eval code","line":3},{"type":300,"expr":{"type":265,"value":"c","file":"eval code","line":3},"true_statements":[{"type":357,"value":"\r\nd\r\n","file":"eval code","line":5}],"file":"eval code","line":5}]},"compile":{"outcome":"value","value":"a\r\n\r\n\r\nd\r\n"}} + } +} diff --git a/tests/fixtures/parity/lines.php b/tests/fixtures/parity/lines.php new file mode 100644 index 0000000..d4f975f --- /dev/null +++ b/tests/fixtures/parity/lines.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +/** + * Line numbers. Lemon stamps `line` when a rule is reduced, which happens only + * once the NEXT token has been scanned - so a node's line is that of whatever + * follows it (including newlines inside a following raw fragment, or the final + * line at EOF). Newlines inside string literals are not counted at all. + */ + +return [ + 'if: multiline body' => "{% if a %}\nx\n{% endif %}\ny", + 'if: elseif else multiline' => "{% if a %}\n{% elseif b %}\n{% else %}\n{% endif %}", + 'if: trailing newlines' => "{% if a %}x{% endif %}\n\n\n", + 'echo: operands on lines' => "{{ a\n+\nb }}", + 'echo: trailing newline' => "{{ a }}\n", + 'echo: trailing blank lines' => "{{ a }}\n\n\n", + 'echo: after raw lines' => "text\n\n{{ a }}", + 'echo: string with newline' => "{{ 'multi\nline' }}\n{{ b }}", + 'echo: array on lines' => "{{\n[\n1,\n2\n]\n}}", + 'echo: call args on lines' => "{{ f(\na,\nb\n) }}", + 'for: blank lines' => "{% for x in y %}\n\n{{ x }}\n\n{% endfor %}", + 'for: key value elsefor' => "{% for k, v in y if v %}\n{{ k }}\n{% elsefor %}\nnone\n{% endfor %}", + 'switch: case followed by lines' => "{% switch a %}\n{% case \"Jim\" %}\n\nfoo\n{% endswitch %}", + 'switch: default on lines' => "{% switch a %}\n{% case 1 %}\none\n{% default %}\nother\n{% endswitch %}", + 'set: two statements' => "{% set a = 1 %}\n{% set b = 2 %}", + 'set: multi assignment lines' => "{% set a = 1,\nb = 2,\nc = 3 %}", + 'comment: before echo' => "{# comment\n\n #}{{ a }}", + 'comment: between raw' => "a\n{# c\n #}\nb{{ c }}", + 'macro: params and body' => "{% macro m(a, b = 1) %}\n{{ a }}\n{% endmacro %}", + 'block: empty then newline' => "{% block b %}\n{% endblock %}\n", + 'autoescape: body' => "{% autoescape true %}\n{{ a }}\n{% endautoescape %}", + 'verbatim: body then newline' => "{% verbatim %}\n{{ a }}\n{% endverbatim %}\n", + 'include: with then newline' => "{% include 'a' with {'b': 1} %}\n", + 'do: return on lines' => "{% do a() %}\n\n{% return b %}", + 'whitespace control: lines' => "{%- if a -%}\n x \n{%- endif -%}\n", + 'call: body on lines' => "{% call f(1) %}\nbody\n{% endcall %}\n", + 'ternary: on lines' => "{{ a\n?\nb\n:\nc }}", + 'filter: on lines' => "{{ a\n|\nf\n}}", + 'raw only multiline' => "a\nb\nc", + 'crlf raw and code' => "a\r\n{{ b }}\r\n{% if c %}\r\nd\r\n{% endif %}", +]; diff --git a/tests/fixtures/parity/precedence.json b/tests/fixtures/parity/precedence.json new file mode 100644 index 0000000..484f189 --- /dev/null +++ b/tests/fixtures/parity/precedence.json @@ -0,0 +1,122 @@ +{ + "generator": "ext-phalcon 5.23.0", + "cases": { + "echo: 1 + 2 * 3": {"source":"{{ 1 + 2 * 3 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":42,"left":{"type":43,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: 1 * 2 + 3": {"source":"{{ 1 * 2 + 3 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":42,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":43,"left":{"type":258,"value":"2","file":"eval code","line":1},"right":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: 1 - 2 - 3": {"source":"{{ 1 - 2 - 3 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":45,"left":{"type":45,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: 1 / 2 / 3": {"source":"{{ 1 / 2 / 3 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":47,"left":{"type":47,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: 1 % 2 * 3": {"source":"{{ 1 % 2 * 3 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":42,"left":{"type":37,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: 1 * 2 % 3": {"source":"{{ 1 * 2 % 3 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":37,"left":{"type":42,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a ~ b ~ c": {"source":"{{ a ~ b ~ c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":126,"left":{"type":126,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a ~ b + c": {"source":"{{ a ~ b + c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":43,"left":{"type":126,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a + b ~ c": {"source":"{{ a + b ~ c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":126,"left":{"type":43,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a + b[0]": {"source":"{{ a + b[0] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":43,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a * b[0]": {"source":"{{ a * b[0] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":42,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":361,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a.b[0]": {"source":"{{ a.b[0] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"b[0] ?>"}}, + "echo: a.b(c)": {"source":"{{ a.b(c) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"b($c) ?>"}}, + "echo: a.b.c": {"source":"{{ a.b.c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"b->c ?>"}}, + "echo: a.b.c(d)": {"source":"{{ a.b.c(d) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":46,"left":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"b->c($d) ?>"}}, + "echo: a.b(c).d": {"source":"{{ a.b(c).d }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":350,"name":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"b($c)->d ?>"}}, + "echo: a[0][1]": {"source":"{{ a[0][1] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a(b)(c)": {"source":"{{ a(b)(c) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":350,"name":{"type":265,"value":"a","file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('a', [$b])($c) ?>"}}, + "echo: a(b)[0]": {"source":"{{ a(b)[0] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":350,"name":{"type":265,"value":"a","file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('a', [$b])[0] ?>"}}, + "echo: !a[0]": {"source":"{{ !a[0] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":33,"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: !a.b": {"source":"{{ !a.b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":33,"right":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"b ?>"}}, + "echo: !a(x)": {"source":"{{ !a(x) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":33,"right":{"type":350,"name":{"type":265,"value":"a","file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"x","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('a', [$x]) ?>"}}, + "echo: !a|f": {"source":"{{ !a|f }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":33,"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"f","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter \"f\" in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "echo: !a and b": {"source":"{{ !a and b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":266,"left":{"type":33,"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: not a or b": {"source":"{{ not a or b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":267,"left":{"type":33,"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: not a not in b": {"source":"{{ not a not in b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":33,"right":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"isIncluded($a, $b) ?>"}}, + "echo: -a.b": {"source":"{{ -a.b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":368,"right":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"b ?>"}}, + "echo: -a * b": {"source":"{{ -a * b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":42,"left":{"type":368,"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: -a + b": {"source":"{{ -a + b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":43,"left":{"type":368,"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: -a[0]": {"source":"{{ -a[0] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":368,"right":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: -a|f": {"source":"{{ -a|f }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":368,"right":{"type":124,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"f","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter \"f\" in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "echo: -a++": {"source":"{{ -a++ }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":368,"right":{"type":279,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown expression 279 in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltExpression"}}, + "echo: +a - -b": {"source":"{{ +a - -b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":45,"left":{"type":369,"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":368,"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: -1 + 2": {"source":"{{ -1 + 2 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":43,"left":{"type":368,"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a|f(x)": {"source":"{{ a|f(x) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"x","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter \"f\" in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "echo: a|f[0]": {"source":"{{ a|f[0] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":124,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"f","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter \"f\" in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "echo: a|b|c": {"source":"{{ a|b|c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":124,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter \"b\" in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "echo: a|b(1)|c": {"source":"{{ a|b(1)|c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":124,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"b","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter \"b\" in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "echo: \"x\" ~ a|upper": {"source":"{{ \"x\" ~ a|upper }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":126,"left":{"type":260,"value":"x","file":"eval code","line":1},"right":{"type":124,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"upper","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a not in b + c": {"source":"{{ a not in b + c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":43,"left":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"isIncluded($a, $b) + $c ?>"}}, + "echo: a + b not in c": {"source":"{{ a + b not in c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":43,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"isIncluded($b, $c) ?>"}}, + "echo: a not in b not in c": {"source":"{{ a not in b not in c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":367,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"isIncluded($a, !$this->isIncluded($b, $c)) ?>"}}, + "echo: a not in b[0]": {"source":"{{ a not in b[0] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"isIncluded($a, $b)[0] ?>"}}, + "echo: a not in b(1)": {"source":"{{ a not in b(1) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"b","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"isIncluded($a, $this->callMacro('b', [1])) ?>"}}, + "echo: a in b + c": {"source":"{{ a in b + c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":309,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":43,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"isIncluded($a, $b + $c) ?>"}}, + "echo: a in b in c": {"source":"{{ a in b in c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":309,"left":{"type":309,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"isIncluded($this->isIncluded($a, $b), $c) ?>"}}, + "echo: a in b and c": {"source":"{{ a in b and c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":266,"left":{"type":309,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"isIncluded($a, $b) && $c ?>"}}, + "echo: a ? b : c ? d : e": {"source":"{{ a ? b : c ? d : e }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"left":{"type":265,"value":"d","file":"eval code","line":1},"right":{"type":265,"value":"e","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a ? b ? c : d : e": {"source":"{{ a ? b ? c : d : e }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":366,"ternary":{"type":265,"value":"b","file":"eval code","line":1},"left":{"type":265,"value":"c","file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"e","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a ? b .. c : d": {"source":"{{ a ? b .. c : d }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":276,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a ? b : c .. d": {"source":"{{ a ? b : c .. d }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":276,"left":{"type":265,"value":"c","file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a ? b and c : d": {"source":"{{ a ? b and c : d }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":266,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: x + a ? b : c": {"source":"{{ x + a ? b : c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":43,"left":{"type":265,"value":"x","file":"eval code","line":1},"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a ? b : c + d": {"source":"{{ a ? b : c + d }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":43,"left":{"type":265,"value":"c","file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a .. b + c": {"source":"{{ a .. b + c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":276,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":43,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a..b..c": {"source":"{{ a..b..c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":276,"left":{"type":276,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a .. b and c": {"source":"{{ a .. b and c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":276,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":266,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a is defined and b": {"source":"{{ a is defined and b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":266,"left":{"type":363,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a is b + c": {"source":"{{ a is b + c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":311,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":43,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a is not b + c": {"source":"{{ a is not b + c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":273,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":43,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: x == a is defined": {"source":"{{ x == a is defined }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":363,"left":{"type":272,"left":{"type":265,"value":"x","file":"eval code","line":1},"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a.b is defined": {"source":"{{ a.b is defined }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":363,"left":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"b) ?>"}}, + "echo: a[0] is empty": {"source":"{{ a[0] is empty }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":386,"left":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a|f is defined": {"source":"{{ a|f is defined }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":363,"left":{"type":124,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"f","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter \"f\" in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "echo: a ? b : c is defined": {"source":"{{ a ? b : c is defined }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":363,"left":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a ~ b == c": {"source":"{{ a ~ b == c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":272,"left":{"type":126,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a == b == c": {"source":"{{ a == b == c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":272,"left":{"type":272,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a < b > c": {"source":"{{ a < b > c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":62,"left":{"type":60,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" $c ?>"}}, + "echo: a === b !== c": {"source":"{{ a === b !== c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":275,"left":{"type":274,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a >= b <= c": {"source":"{{ a >= b <= c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":270,"left":{"type":271,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"= $b <= $c ?>"}}, + "echo: a == b and c != d": {"source":"{{ a == b and c != d }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":266,"left":{"type":272,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":273,"left":{"type":265,"value":"c","file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a or b and c": {"source":"{{ a or b and c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":266,"left":{"type":267,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a and b or c": {"source":"{{ a and b or c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":267,"left":{"type":266,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: 2**3**2": {"source":"{{ 2**3**2 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":278,"left":{"type":278,"left":{"type":258,"value":"2","file":"eval code","line":1},"right":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: 2 + 3 ** 4": {"source":"{{ 2 + 3 ** 4 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":278,"left":{"type":43,"left":{"type":258,"value":"2","file":"eval code","line":1},"right":{"type":258,"value":"3","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"4","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: 2 ** 3 + 4": {"source":"{{ 2 ** 3 + 4 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":278,"left":{"type":258,"value":"2","file":"eval code","line":1},"right":{"type":43,"left":{"type":258,"value":"3","file":"eval code","line":1},"right":{"type":258,"value":"4","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a // b": {"source":"{{ a // b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":37,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a // b * c": {"source":"{{ a // b * c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":42,"left":{"type":37,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a * b // c": {"source":"{{ a * b // c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":37,"left":{"type":42,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a.b++": {"source":"{{ a.b++ }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":279,"left":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown expression 279 in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltExpression"}}, + "echo: a++ + b--": {"source":"{{ a++ + b-- }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":43,"left":{"type":279,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":280,"left":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown expression 279 in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltExpression"}}, + "echo: a.-b*c": {"source":"{{ a.-b*c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":42,"left":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":368,"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"-$b * $c ?>"}}, + "echo: a.(b)": {"source":"{{ a.(b) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":356,"left":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"($b) ?>"}}, + "echo: a.[1]": {"source":"{{ a.[1] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"[1] ?>"}}, + "echo: a.\"s\"": {"source":"{{ a.\"s\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":260,"value":"s","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"'s' ?>"}}, + "echo: a.1": {"source":"{{ a.1 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"1 ?>"}}, + "echo: (a + b) * c": {"source":"{{ (a + b) * c }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":42,"left":{"type":356,"left":{"type":43,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: (a)(b)": {"source":"{{ (a)(b) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":356,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: [1, 2][0]": {"source":"{{ [1, 2][0] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: {\"a\": 1}[\"a\"]": {"source":"{{ {\"a\": 1}[\"a\"] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"name":"a","file":"eval code","line":1}],"file":"eval code","line":1},"right":{"type":260,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" 1]['a'] ?>"}}, + "echo: [1, 2]|length": {"source":"{{ [1, 2]|length }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":360,"left":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"right":{"type":265,"value":"length","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"length([1, 2]) ?>"}}, + "echo: a[1:2]": {"source":"{{ a[1:2] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":365,"left":{"type":265,"value":"a","file":"eval code","line":1},"start":{"type":258,"value":"1","file":"eval code","line":1},"end":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"slice($a, 1, 2) ?>"}}, + "echo: a[:2]": {"source":"{{ a[:2] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":365,"left":{"type":265,"value":"a","file":"eval code","line":1},"end":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"slice($a, null, 2) ?>"}}, + "echo: a[1:]": {"source":"{{ a[1:] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":365,"left":{"type":265,"value":"a","file":"eval code","line":1},"start":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"slice($a, 1, null) ?>"}}, + "echo: a[b:c]": {"source":"{{ a[b:c] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":365,"left":{"type":265,"value":"a","file":"eval code","line":1},"start":{"type":265,"value":"b","file":"eval code","line":1},"end":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"slice($a, $b, $c) ?>"}}, + "echo: a[b]": {"source":"{{ a[b] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a[b + 1]": {"source":"{{ a[b + 1] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":43,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a[1 + 2]": {"source":"{{ a[1 + 2] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":43,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: a[b|f]": {"source":"{{ a[b|f] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":124,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"f","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter \"f\" in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "echo: a[1:2][0]": {"source":"{{ a[1:2][0] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":361,"left":{"type":365,"left":{"type":265,"value":"a","file":"eval code","line":1},"start":{"type":258,"value":"1","file":"eval code","line":1},"end":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"slice($a, 1, 2)[0] ?>"}}, + "echo: a.b[1:2]": {"source":"{{ a.b[1:2] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":365,"left":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"start":{"type":258,"value":"1","file":"eval code","line":1},"end":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"slice($a->b, 1, 2) ?>"}}, + "echo: f(a + b, c * d)": {"source":"{{ f(a + b, c * d) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":43,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":42,"left":{"type":265,"value":"c","file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('f', [$a + $b, $c * $d]) ?>"}}, + "echo: f(a ? b : c)": {"source":"{{ f(a ? b : c) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('f', [($a ? $b : $c)]) ?>"}}, + "echo: f(\"k\": a + b)": {"source":"{{ f(\"k\": a + b) }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"f","file":"eval code","line":1},"arguments":[{"expr":{"type":43,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"name":"k","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('f', ['k' => $a + $b]) ?>"}}, + "echo: [a + b, c ~ d]": {"source":"{{ [a + b, c ~ d] }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":43,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},{"expr":{"type":126,"left":{"type":265,"value":"c","file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo: {\"k\": a ? b : c}": {"source":"{{ {\"k\": a ? b : c} }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":360,"left":[{"expr":{"type":366,"ternary":{"type":265,"value":"a","file":"eval code","line":1},"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"name":"k","file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":" ($a ? $b : $c)] ?>"}}, + "set: a = b + c * d": {"source":"{% set a = b + c * d %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":61,"expr":{"type":42,"left":{"type":43,"left":{"type":265,"value":"b","file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "set: a.b.c[0] = 1": {"source":"{% set a.b.c[0] = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":361,"left":{"type":46,"left":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":"b->c[0] = 1; ?>"}}, + "set: a[0].b = 1": {"source":"{% set a[0].b = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":46,"left":{"type":361,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":258,"value":"0","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":"b = 1; ?>"}}, + "if: a or b and c": {"source":"{% if a or b and c %}x{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":266,"left":{"type":267,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "for: iterable a + b": {"source":"{% for x in a + b %}x{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"x","expr":{"type":43,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "for: if a not in b": {"source":"{% for x in y if a not in b %}x{% endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"x","expr":{"type":265,"value":"y","file":"eval code","line":1},"if_expr":{"type":367,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"isIncluded($a, $b)) { ?>x"}}, + "do: a.b(c)|f": {"source":"{% do a.b(c)|f %}","parse":{"outcome":"value","value":[{"type":316,"expr":{"type":124,"left":{"type":350,"name":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"arguments":[{"expr":{"type":265,"value":"c","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"right":{"type":265,"value":"f","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter \"f\" in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "return: -a * b": {"source":"{% return -a * b %}","parse":{"outcome":"value","value":[{"type":327,"expr":{"type":42,"left":{"type":368,"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "include: with a ~ b": {"source":"{% include \"x\" ~ y with a ~ b %}","parse":{"outcome":"value","value":[{"type":313,"path":{"type":126,"left":{"type":260,"value":"x","file":"eval code","line":1},"right":{"type":265,"value":"y","file":"eval code","line":1},"file":"eval code","line":1},"params":{"type":126,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"partial('x' . $y, $a . $b); ?>"}}, + "extends: a ~ b": {"source":"{% extends a ~ \"b\" %}","parse":{"outcome":"value","value":[{"type":310,"path":{"type":126,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":260,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Template file does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}}, + "switch: a + b": {"source":"{% switch a + b %}{% case c * d %}x{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":43,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"case_clauses":[{"type":412,"expr":{"type":42,"left":{"type":265,"value":"c","file":"eval code","line":1},"right":{"type":265,"value":"d","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}} + } +} diff --git a/tests/fixtures/parity/precedence.php b/tests/fixtures/parity/precedence.php new file mode 100644 index 0000000..a2ae58f --- /dev/null +++ b/tests/fixtures/parity/precedence.php @@ -0,0 +1,148 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +/** + * Operator precedence and associativity, as resolved by the Lemon grammar + * (parser.php.lemon lines 22-36). Several groupings are counter-intuitive - + * `*` binds looser than `+`, `!` binds tighter than `[`, `not in` binds + * tighter than `in` - which is exactly why each one is pinned here. + */ + +$expressions = [ + '1 + 2 * 3', + '1 * 2 + 3', + '1 - 2 - 3', + '1 / 2 / 3', + '1 % 2 * 3', + '1 * 2 % 3', + 'a ~ b ~ c', + 'a ~ b + c', + 'a + b ~ c', + 'a + b[0]', + 'a * b[0]', + 'a.b[0]', + 'a.b(c)', + 'a.b.c', + 'a.b.c(d)', + 'a.b(c).d', + 'a[0][1]', + 'a(b)(c)', + 'a(b)[0]', + '!a[0]', + '!a.b', + '!a(x)', + '!a|f', + '!a and b', + 'not a or b', + 'not a not in b', + '-a.b', + '-a * b', + '-a + b', + '-a[0]', + '-a|f', + '-a++', + '+a - -b', + '-1 + 2', + 'a|f(x)', + 'a|f[0]', + 'a|b|c', + 'a|b(1)|c', + '"x" ~ a|upper', + 'a not in b + c', + 'a + b not in c', + 'a not in b not in c', + 'a not in b[0]', + 'a not in b(1)', + 'a in b + c', + 'a in b in c', + 'a in b and c', + 'a ? b : c ? d : e', + 'a ? b ? c : d : e', + 'a ? b .. c : d', + 'a ? b : c .. d', + 'a ? b and c : d', + 'x + a ? b : c', + 'a ? b : c + d', + 'a .. b + c', + 'a..b..c', + 'a .. b and c', + 'a is defined and b', + 'a is b + c', + 'a is not b + c', + 'x == a is defined', + 'a.b is defined', + 'a[0] is empty', + 'a|f is defined', + 'a ? b : c is defined', + 'a ~ b == c', + 'a == b == c', + 'a < b > c', + 'a === b !== c', + 'a >= b <= c', + 'a == b and c != d', + 'a or b and c', + 'a and b or c', + '2**3**2', + '2 + 3 ** 4', + '2 ** 3 + 4', + 'a // b', + 'a // b * c', + 'a * b // c', + 'a.b++', + 'a++ + b--', + 'a.-b*c', + 'a.(b)', + 'a.[1]', + 'a."s"', + 'a.1', + '(a + b) * c', + '(a)(b)', + '[1, 2][0]', + '{"a": 1}["a"]', + '[1, 2]|length', + 'a[1:2]', + 'a[:2]', + 'a[1:]', + 'a[b:c]', + 'a[b]', + 'a[b + 1]', + 'a[1 + 2]', + 'a[b|f]', + 'a[1:2][0]', + 'a.b[1:2]', + 'f(a + b, c * d)', + 'f(a ? b : c)', + 'f("k": a + b)', + '[a + b, c ~ d]', + '{"k": a ? b : c}', +]; + +$cases = []; + +foreach ($expressions as $expression) { + $cases['echo: ' . $expression] = '{{ ' . $expression . ' }}'; +} + +$cases['set: a = b + c * d'] = '{% set a = b + c * d %}'; +$cases['set: a.b.c[0] = 1'] = '{% set a.b.c[0] = 1 %}'; +$cases['set: a[0].b = 1'] = '{% set a[0].b = 1 %}'; +$cases['if: a or b and c'] = '{% if a or b and c %}x{% endif %}'; +$cases['for: iterable a + b'] = '{% for x in a + b %}x{% endfor %}'; +$cases['for: if a not in b'] = '{% for x in y if a not in b %}x{% endfor %}'; +$cases['do: a.b(c)|f'] = '{% do a.b(c)|f %}'; +$cases['return: -a * b'] = '{% return -a * b %}'; +$cases['include: with a ~ b'] = '{% include "x" ~ y with a ~ b %}'; +$cases['extends: a ~ b'] = '{% extends a ~ "b" %}'; +$cases['switch: a + b'] = '{% switch a + b %}{% case c * d %}x{% endswitch %}'; + +return $cases; diff --git a/tests/fixtures/parity/scanner-edge.json b/tests/fixtures/parity/scanner-edge.json new file mode 100644 index 0000000..4b76f87 --- /dev/null +++ b/tests/fixtures/parity/scanner-edge.json @@ -0,0 +1,125 @@ +{ + "generator": "ext-phalcon 5.23.0", + "cases": { + "empty": {"source":"","parse":{"outcome":"value","value":[]},"compile":{"outcome":"value","value":""}}, + "single space": {"source":" ","parse":{"outcome":"value","value":[{"type":357,"value":" ","file":"eval code","line":1}]},"compile":{"outcome":"value","value":" "}}, + "single newline": {"source":"\n","parse":{"outcome":"value","value":[{"type":357,"value":"\n","file":"eval code","line":2}]},"compile":{"outcome":"value","value":"\n"}}, + "comment only": {"source":"{# #}","parse":{"outcome":"value","value":[]},"compile":{"outcome":"value","value":""}}, + "empty statement": {"source":"{% %}","parse":{"outcome":"value","value":[{"type":358,"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "empty statements": {"source":"{% %}{% %}","parse":{"outcome":"value","value":[{"type":358,"file":"eval code","line":1},{"type":358,"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "raw only": {"source":"hello","parse":{"outcome":"value","value":[{"type":357,"value":"hello","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"hello"}}, + "nul in raw": {"source":"x\u0000y","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "nul between echoes": {"source":"{{ a }}\u0000{{ b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "nul in code": {"source":"{{ a \u0000 b }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token WHITESPACE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token WHITESPACE in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "nul in string": {"source":"{{ 'a\u0000b' }}","parse":{"outcome":"throw","value":"Scanning error before 'a' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Scanning error before 'a' in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "comment: empty braces": {"source":"{#}","parse":{"outcome":"value","value":[]},"compile":{"outcome":"value","value":""}}, + "comment: empty braces raw": {"source":"{#}x","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "comment: zero": {"source":"{# 0 #}x","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "comment: zero tight": {"source":"{#0#}x","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "comment: joins raw": {"source":"a{# c #}b","parse":{"outcome":"value","value":[{"type":357,"value":"ab","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"ab"}}, + "comment: joins raw spaced": {"source":"Hello {# c #} World","parse":{"outcome":"value","value":[{"type":357,"value":"Hello World","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"Hello World"}}, + "comment: unterminated": {"source":"a{#","parse":{"outcome":"value","value":[]},"compile":{"outcome":"value","value":""}}, + "comment: unterminated text": {"source":"a{# b","parse":{"outcome":"value","value":[]},"compile":{"outcome":"value","value":""}}, + "comment: contains tags": {"source":"{# {{ a }} {% if %} #}x","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "comment: hash brace inside": {"source":"{# a # } #}x","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "comment: before statement": {"source":"{# a #}{% if b %}c{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"b","file":"eval code","line":1},"true_statements":[{"type":357,"value":"c","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"c"}}, + "comment: dash": {"source":"x {#- c -#} y","parse":{"outcome":"value","value":[{"type":357,"value":"x y","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x y"}}, + "is not: one space": {"source":"{{ a is not b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":273,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "is not: upper": {"source":"{{ a IS NOT b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":273,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "is not: mixed": {"source":"{{ a Is Not b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":273,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "is not: two spaces": {"source":"{{ a is not b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":273,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "is not: two spaces upper": {"source":"{{ a IS NOT b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":311,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":33,"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "is not: tab": {"source":"{{ a is\tnot b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":311,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":33,"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "is not: nothing": {"source":"{{ a is nothing }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":273,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"hing","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "is not: underscore": {"source":"{{ a is not_x }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":273,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"_x","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "is not: defined": {"source":"{{ a is not defined }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":362,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "is: identifier": {"source":"{{ a is b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":311,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "not equals: bang": {"source":"{{ a != b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":273,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "not equals: diamond": {"source":"{{ a <> b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":273,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "not equals: defined": {"source":"{{ a != defined }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":362,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "not equals: empty": {"source":"{{ a <> empty }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":392,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "dot: set": {"source":"{{ a.set }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"set","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"set ?>"}}, + "dot: is": {"source":"{{ a.is }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"is","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"is ?>"}}, + "dot: spaced set": {"source":"{{ a . set }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token SET in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token SET in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "dot: if": {"source":"{{ a.if }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IF in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IF in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "dot: default": {"source":"{{ a.default }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"default","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"default ?>"}}, + "default: echo": {"source":"{{ default }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"default","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "default: filter": {"source":"{{ a|default(\"x\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"default","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"x","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "default: upper filter": {"source":"{{ a|DEFAULT(\"x\") }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":124,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"DEFAULT","file":"eval code","line":1},"arguments":[{"expr":{"type":260,"value":"x","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown filter \"DEFAULT\" in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltFilter"}}, + "default: in switch": {"source":"{% switch a %}{% default %}x{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"a","file":"eval code","line":1},"case_clauses":[{"type":413,"file":"eval code","line":1},{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "default: upper in switch": {"source":"{% switch a %}{% DEFAULT %}x{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"a","file":"eval code","line":1},"case_clauses":[{"type":413,"file":"eval code","line":1},{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "default: echo in switch": {"source":"{% switch a %}{% case 1 %}{{ default }}{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"a","file":"eval code","line":1},"case_clauses":[{"type":412,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"default","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "default: filter in switch": {"source":"{% switch a %}{% case 1 %}{{ a|default(1) }}{% endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"a","file":"eval code","line":1},"case_clauses":[{"type":412,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1},{"type":359,"expr":{"type":124,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":350,"name":{"type":265,"value":"default","file":"eval code","line":1},"arguments":[{"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cache: identifier": {"source":"{{ cachex }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"cachex","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "pow: tight": {"source":"{{ a ** b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":278,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "pow: spaced": {"source":"{{ a * * b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":278,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "floor div: tight": {"source":"{{ a // b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":37,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "floor div: spaced": {"source":"{{ a / / b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":37,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "incr": {"source":"{{ a++ }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":279,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown expression 279 in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltExpression"}}, + "decr": {"source":"{{ a-- }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":280,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"throw","value":"Unknown expression 280 in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\UnknownVoltExpression"}}, + "minus minus spaced": {"source":"{{ a - - b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":45,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":368,"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "number: double": {"source":"{{ 1.5 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":259,"value":"1.5","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "number: trailing dot": {"source":"{{ 1. }}","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "number: leading dot": {"source":"{{ .5 }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token DOT in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token DOT in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "number: range tight": {"source":"{{ 1..2 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":276,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "number: range spaced": {"source":"{{ 1 .. 2 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":276,"left":{"type":258,"value":"1","file":"eval code","line":1},"right":{"type":258,"value":"2","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "number: leading zeros": {"source":"{{ 007 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":258,"value":"007","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "number: double double": {"source":"{{ 1.5.6 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":46,"left":{"type":259,"value":"1.5","file":"eval code","line":1},"right":{"type":258,"value":"6","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"6 ?>"}}, + "number: big": {"source":"{{ 99999999999999999999 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":258,"value":"99999999999999999999","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "number: digit identifier": {"source":"{{ 1a }}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(a) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(a) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "ident: namespaced": {"source":"{{ \\Foo\\Bar }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"\\Foo\\Bar","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "ident: namespaced call": {"source":"{{ Foo\\Bar() }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":350,"name":{"type":265,"value":"Foo\\Bar","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"callMacro('Foo\\Bar', []) ?>"}}, + "ident: underscore": {"source":"{{ _a }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"_a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "ident: digits": {"source":"{{ a1 }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a1","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "ident: keyword prefix": {"source":"{{ iffy }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"iffy","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "ident: keyword suffix": {"source":"{{ endiff }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"endiff","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "ident: nullable": {"source":"{{ nullable }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"nullable","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "ident: true prefix": {"source":"{{ trueish }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"trueish","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "case: if upper": {"source":"{% IF a %}x{% ENDIF %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "case: if mixed": {"source":"{% If a %}x{% EndIf %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "case: true upper": {"source":"{{ TRUE }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":263,"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "case: null mixed": {"source":"{{ Null }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":261,"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "case: and upper": {"source":"{{ a AND b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":266,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "case: or mixed": {"source":"{{ a Or b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":267,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "case: not upper": {"source":"{{ NOT a }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":33,"right":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "case: for upper": {"source":"{% FOR a IN b %}x{% ENDFOR %}","parse":{"outcome":"value","value":[{"type":304,"variable":"a","expr":{"type":265,"value":"b","file":"eval code","line":1},"block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "case: set upper": {"source":"{% SET a = 1 %}","parse":{"outcome":"value","value":[{"type":306,"assignments":[{"variable":{"type":265,"value":"a","file":"eval code","line":1},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]}]},"compile":{"outcome":"value","value":""}}, + "case: block upper": {"source":"{% BLOCK a %}x{% ENDBLOCK %}","parse":{"outcome":"value","value":[{"type":307,"name":"a","block_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "case: is defined upper": {"source":"{{ a IS DEFINED }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":363,"left":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "string: escaped dq": {"source":"{{ \"a\\\"b\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"a\\\"b","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "string: escaped sq": {"source":"{{ 'a\\'b' }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"a\\'b","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "string: real newline": {"source":"{{ \"a\nb\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"a\nb","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "string: escape n": {"source":"{{ \"\\n\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"\\n","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "string: empty sq": {"source":"{{ '' }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "string: empty dq": {"source":"{{ \"\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "string: contains open": {"source":"{{ \"a{{b\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"a{{b","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "string: contains close": {"source":"{{ \"%}\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"%}","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "string: contains close echo": {"source":"{{ \"}}\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"}}","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "string: backslash backslash": {"source":"{{ \"a\\\\\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"a\\\\","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "string: dollar": {"source":"{{ \"$a\" }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":260,"value":"$a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "string: mixed quotes": {"source":"{{ \"it's\" ~ 'say \"hi\"' }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":126,"left":{"type":260,"value":"it's","file":"eval code","line":1},"right":{"type":260,"value":"say \"hi\"","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "tight echo": {"source":"{{a}}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "tight statement": {"source":"{%if a%}x{%endif%}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"x","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "tabs in code": {"source":"{{ a\t~\tb }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":126,"left":{"type":265,"value":"a","file":"eval code","line":1},"right":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "cr in code": {"source":"{{\ra\r}}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "echo then text": {"source":"{{ a }}text","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"text","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"text"}}, + "text then echo": {"source":"text{{ a }}","parse":{"outcome":"value","value":[{"type":357,"value":"text","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"text"}}, + "adjacent echoes": {"source":"{{ a }}{{ b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "brace in raw": {"source":"a { b } c","parse":{"outcome":"value","value":[{"type":357,"value":"a { b } c","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"a { b } c"}}, + "percent in raw": {"source":"a % b %} c","parse":{"outcome":"value","value":[{"type":357,"value":"a % b %} c","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"a % b %} c"}}, + "lone open brace end": {"source":"a {","parse":{"outcome":"value","value":[{"type":357,"value":"a {","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"a {"}}, + "lone open brace percent end": {"source":"a {%","parse":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected EOF in eval code","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "verbatim: echo inside": {"source":"{% verbatim %}{{ a }}{% endverbatim %}","parse":{"outcome":"value","value":[{"type":357,"value":"{{ a }}","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"{{ a }}"}}, + "verbatim: empty": {"source":"{% verbatim %}{% endverbatim %}","parse":{"outcome":"value","value":[{"type":357,"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "verbatim: upper": {"source":"{% VERBATIM %}x{% ENDVERBATIM %}","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "verbatim: statement inside": {"source":"{% verbatim %}{% if %}{% endverbatim %}","parse":{"outcome":"value","value":[{"type":357,"value":"{% if %}","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"{% if %}"}}, + "verbatim: spaced end": {"source":"{% verbatim %}x{% endverbatim %}","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "verbatim: tight end": {"source":"{% verbatim %}x{%endverbatim%}","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "verbatim: then echo": {"source":"{% verbatim %}x{% endverbatim %}{{ a }}","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"x"}}, + "verbatim: twice": {"source":"{% verbatim %}a{% endverbatim %}b{% verbatim %}c{% endverbatim %}","parse":{"outcome":"value","value":[{"type":357,"value":"a","file":"eval code","line":1},{"type":357,"value":"b","file":"eval code","line":1},{"type":357,"value":"c","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"abc"}}, + "verbatim: whitespace control": {"source":"{%- verbatim -%} x {%- endverbatim -%}","parse":{"outcome":"value","value":[{"type":357,"value":" x ","file":"eval code","line":1}]},"compile":{"outcome":"value","value":" x "}}, + "verbatim: in if": {"source":"{% if a %}{% verbatim %}{{ b }}{% endverbatim %}{% endif %}","parse":{"outcome":"value","value":[{"type":300,"expr":{"type":265,"value":"a","file":"eval code","line":1},"true_statements":[{"type":357,"value":"{{ b }}","file":"eval code","line":1}],"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"{{ b }}"}}, + "verbatim: endverbatim text": {"source":"{% verbatim %}a {% endverbatim b %}c{% endverbatim %}","parse":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(b) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token IDENTIFIER(b) in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "verbatim: identifier": {"source":"{{ verbatimx }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"verbatimx","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}} + } +} diff --git a/tests/fixtures/parity/scanner-edge.php b/tests/fixtures/parity/scanner-edge.php new file mode 100644 index 0000000..495c533 --- /dev/null +++ b/tests/fixtures/parity/scanner-edge.php @@ -0,0 +1,165 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +/** + * Scanner rules from scanner.re that are easy to get subtly wrong: longest + * match vs keyword priority, case-insensitive keywords, the `is not` variants, + * context-sensitive `set` / `is` / `default`, two-token `**` and `//`, + * number forms, string escapes, comments, NUL bytes and whitespace control. + */ + +return [ + // Empty and blank input + 'empty' => '', + 'single space' => ' ', + 'single newline' => "\n", + 'comment only' => '{# #}', + 'empty statement' => '{% %}', + 'empty statements' => '{% %}{% %}', + 'raw only' => 'hello', + + // NUL bytes end the scan + 'nul in raw' => "x\0y", + 'nul between echoes' => "{{ a }}\0{{ b }}", + 'nul in code' => "{{ a \0 b }}", + 'nul in string' => "{{ 'a\0b' }}", + + // Comments + 'comment: empty braces' => '{#}', + 'comment: empty braces raw' => '{#}x', + 'comment: zero' => '{# 0 #}x', + 'comment: zero tight' => '{#0#}x', + 'comment: joins raw' => 'a{# c #}b', + 'comment: joins raw spaced' => 'Hello {# c #} World', + 'comment: unterminated' => 'a{#', + 'comment: unterminated text' => 'a{# b', + 'comment: contains tags' => '{# {{ a }} {% if %} #}x', + 'comment: hash brace inside' => '{# a # } #}x', + 'comment: before statement' => '{# a #}{% if b %}c{% endif %}', + 'comment: dash' => 'x {#- c -#} y', + + // is not / not equals + 'is not: one space' => '{{ a is not b }}', + 'is not: upper' => '{{ a IS NOT b }}', + 'is not: mixed' => '{{ a Is Not b }}', + 'is not: two spaces' => '{{ a is not b }}', + 'is not: two spaces upper' => '{{ a IS NOT b }}', + 'is not: tab' => "{{ a is\tnot b }}", + 'is not: nothing' => '{{ a is nothing }}', + 'is not: underscore' => '{{ a is not_x }}', + 'is not: defined' => '{{ a is not defined }}', + 'is: identifier' => '{{ a is b }}', + 'not equals: bang' => '{{ a != b }}', + 'not equals: diamond' => '{{ a <> b }}', + 'not equals: defined' => '{{ a != defined }}', + 'not equals: empty' => '{{ a <> empty }}', + + // Context-sensitive identifiers + 'dot: set' => '{{ a.set }}', + 'dot: is' => '{{ a.is }}', + 'dot: spaced set' => '{{ a . set }}', + 'dot: if' => '{{ a.if }}', + 'dot: default' => '{{ a.default }}', + 'default: echo' => '{{ default }}', + 'default: filter' => '{{ a|default("x") }}', + 'default: upper filter' => '{{ a|DEFAULT("x") }}', + 'default: in switch' => '{% switch a %}{% default %}x{% endswitch %}', + 'default: upper in switch' => '{% switch a %}{% DEFAULT %}x{% endswitch %}', + 'default: echo in switch' => '{% switch a %}{% case 1 %}{{ default }}{% endswitch %}', + 'default: filter in switch' => '{% switch a %}{% case 1 %}{{ a|default(1) }}{% endswitch %}', + 'cache: identifier' => '{{ cachex }}', + + // Two-token operators + 'pow: tight' => '{{ a ** b }}', + 'pow: spaced' => '{{ a * * b }}', + 'floor div: tight' => '{{ a // b }}', + 'floor div: spaced' => '{{ a / / b }}', + 'incr' => '{{ a++ }}', + 'decr' => '{{ a-- }}', + 'minus minus spaced' => '{{ a - - b }}', + + // Numbers + 'number: double' => '{{ 1.5 }}', + 'number: trailing dot' => '{{ 1. }}', + 'number: leading dot' => '{{ .5 }}', + 'number: range tight' => '{{ 1..2 }}', + 'number: range spaced' => '{{ 1 .. 2 }}', + 'number: leading zeros' => '{{ 007 }}', + 'number: double double' => '{{ 1.5.6 }}', + 'number: big' => '{{ 99999999999999999999 }}', + 'number: digit identifier' => '{{ 1a }}', + + // Identifiers + 'ident: namespaced' => '{{ \\Foo\\Bar }}', + 'ident: namespaced call' => '{{ Foo\\Bar() }}', + 'ident: underscore' => '{{ _a }}', + 'ident: digits' => '{{ a1 }}', + 'ident: keyword prefix' => '{{ iffy }}', + 'ident: keyword suffix' => '{{ endiff }}', + 'ident: nullable' => '{{ nullable }}', + 'ident: true prefix' => '{{ trueish }}', + + // Keyword case + 'case: if upper' => '{% IF a %}x{% ENDIF %}', + 'case: if mixed' => '{% If a %}x{% EndIf %}', + 'case: true upper' => '{{ TRUE }}', + 'case: null mixed' => '{{ Null }}', + 'case: and upper' => '{{ a AND b }}', + 'case: or mixed' => '{{ a Or b }}', + 'case: not upper' => '{{ NOT a }}', + 'case: for upper' => '{% FOR a IN b %}x{% ENDFOR %}', + 'case: set upper' => '{% SET a = 1 %}', + 'case: block upper' => '{% BLOCK a %}x{% ENDBLOCK %}', + 'case: is defined upper' => '{{ a IS DEFINED }}', + + // Strings + 'string: escaped dq' => '{{ "a\\"b" }}', + 'string: escaped sq' => "{{ 'a\\'b' }}", + 'string: real newline' => "{{ \"a\nb\" }}", + 'string: escape n' => '{{ "\\n" }}', + 'string: empty sq' => "{{ '' }}", + 'string: empty dq' => '{{ "" }}', + 'string: contains open' => '{{ "a{{b" }}', + 'string: contains close' => '{{ "%}" }}', + 'string: contains close echo' => '{{ "}}" }}', + 'string: backslash backslash' => '{{ "a\\\\" }}', + 'string: dollar' => '{{ "$a" }}', + 'string: mixed quotes' => "{{ \"it's\" ~ 'say \"hi\"' }}", + + // Delimiters and whitespace inside code + 'tight echo' => '{{a}}', + 'tight statement' => '{%if a%}x{%endif%}', + 'tabs in code' => "{{ a\t~\tb }}", + 'cr in code' => "{{\ra\r}}", + 'echo then text' => '{{ a }}text', + 'text then echo' => 'text{{ a }}', + 'adjacent echoes' => '{{ a }}{{ b }}', + 'brace in raw' => 'a { b } c', + 'percent in raw' => 'a % b %} c', + 'lone open brace end' => 'a {', + 'lone open brace percent end' => 'a {%', + + // Verbatim + 'verbatim: echo inside' => '{% verbatim %}{{ a }}{% endverbatim %}', + 'verbatim: empty' => '{% verbatim %}{% endverbatim %}', + 'verbatim: upper' => '{% VERBATIM %}x{% ENDVERBATIM %}', + 'verbatim: statement inside' => '{% verbatim %}{% if %}{% endverbatim %}', + 'verbatim: spaced end' => '{% verbatim %}x{% endverbatim %}', + 'verbatim: tight end' => '{% verbatim %}x{%endverbatim%}', + 'verbatim: then echo' => '{% verbatim %}x{% endverbatim %}{{ a }}', + 'verbatim: twice' => '{% verbatim %}a{% endverbatim %}b{% verbatim %}c{% endverbatim %}', + 'verbatim: whitespace control' => '{%- verbatim -%} x {%- endverbatim -%}', + 'verbatim: in if' => '{% if a %}{% verbatim %}{{ b }}{% endverbatim %}{% endif %}', + 'verbatim: endverbatim text' => '{% verbatim %}a {% endverbatim b %}c{% endverbatim %}', + 'verbatim: identifier' => '{{ verbatimx }}', +]; diff --git a/tests/fixtures/parity/whitespace-control.json b/tests/fixtures/parity/whitespace-control.json new file mode 100644 index 0000000..be77c88 --- /dev/null +++ b/tests/fixtures/parity/whitespace-control.json @@ -0,0 +1,28 @@ +{ + "generator": "ext-phalcon 5.23.0", + "cases": { + "echo: left": {"source":"a {{- b }} c","parse":{"outcome":"value","value":[{"type":357,"value":"a","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":" c","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"a c"}}, + "echo: right": {"source":"a {{ b -}} c","parse":{"outcome":"value","value":[{"type":357,"value":"a ","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"c","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"a c"}}, + "echo: both": {"source":"a {{- b -}} c","parse":{"outcome":"value","value":[{"type":357,"value":"a","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"c","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"ac"}}, + "statement: both": {"source":"a \n {%- if x %} y {% endif -%} \n z","parse":{"outcome":"value","value":[{"type":357,"value":"a","file":"eval code","line":2},{"type":300,"expr":{"type":265,"value":"x","file":"eval code","line":2},"true_statements":[{"type":357,"value":" y ","file":"eval code","line":2}],"file":"eval code","line":3},{"type":357,"value":"z","file":"eval code","line":3}]},"compile":{"outcome":"value","value":"a y z"}}, + "statement: set": {"source":"a \n\t{%- set x = 1 -%}\n\t b","parse":{"outcome":"value","value":[{"type":357,"value":"a","file":"eval code","line":2},{"type":306,"assignments":[{"variable":{"type":265,"value":"x","file":"eval code","line":2},"op":61,"expr":{"type":258,"value":"1","file":"eval code","line":2},"file":"eval code","line":2}]},{"type":357,"value":"b","file":"eval code","line":3}]},"compile":{"outcome":"value","value":"ab"}}, + "statement: all whitespace": {"source":" \t\u000b\n\r {{- a -}} \t\u000b\n\r ","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":2},"file":"eval code","line":3}]},"compile":{"outcome":"value","value":""}}, + "statement: form feed kept": {"source":"a\f {{- b -}} \fc","parse":{"outcome":"value","value":[{"type":357,"value":"a\f","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"\fc","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"a\f\fc"}}, + "statement: nul kept": {"source":"a\u0000 {{- b }}","parse":{"outcome":"value","value":[{"type":357,"value":"a","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"a"}}, + "adjacent tags": {"source":"x {{- a -}}{{- b -}} y","parse":{"outcome":"value","value":[{"type":357,"value":"x","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"y","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"xy"}}, + "trim to nothing": {"source":" {{- a -}} ","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "trim between tags": {"source":"{{ a -}} {{- b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "trim newline lines": {"source":"{{ a -}}\n\n\n{{ b }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":4},{"type":359,"expr":{"type":265,"value":"b","file":"eval code","line":4},"file":"eval code","line":4}]},"compile":{"outcome":"value","value":""}}, + "comment then trim": {"source":"{# c #} {{- a }}","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":""}}, + "comment after trim": {"source":"{{ a -}} {# c #} b","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"b","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"b"}}, + "minus spaced not control": {"source":"a {{ b - }} c","parse":{"outcome":"throw","value":"Syntax error, unexpected token }} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token }} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "minus before close": {"source":"{{ a - -}}b","parse":{"outcome":"throw","value":"Syntax error, unexpected token }} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"},"compile":{"outcome":"throw","value":"Syntax error, unexpected token }} in eval code on line 1","exception":"Phalcon\\Mvc\\View\\Exception"}}, + "tight minus close": {"source":"{{ a-}}b","parse":{"outcome":"value","value":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":1},"file":"eval code","line":1},{"type":357,"value":"b","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"b"}}, + "tight minus open": {"source":"a{{-b}}","parse":{"outcome":"value","value":[{"type":357,"value":"a","file":"eval code","line":1},{"type":359,"expr":{"type":265,"value":"b","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"a"}}, + "open minus number": {"source":"a {{-1}}","parse":{"outcome":"value","value":[{"type":357,"value":"a","file":"eval code","line":1},{"type":359,"expr":{"type":258,"value":"1","file":"eval code","line":1},"file":"eval code","line":1}]},"compile":{"outcome":"value","value":"a"}}, + "statement tight minus": {"source":"a {%-if b-%} c {%-endif-%} d","parse":{"outcome":"value","value":[{"type":357,"value":"a","file":"eval code","line":1},{"type":300,"expr":{"type":265,"value":"b","file":"eval code","line":1},"true_statements":[{"type":357,"value":"c","file":"eval code","line":1}],"file":"eval code","line":1},{"type":357,"value":"d","file":"eval code","line":1}]},"compile":{"outcome":"value","value":"acd"}}, + "in for body": {"source":"{% for a in b -%}\n {{ a }}\n{%- endfor %}","parse":{"outcome":"value","value":[{"type":304,"variable":"a","expr":{"type":265,"value":"b","file":"eval code","line":1},"block_statements":[{"type":359,"expr":{"type":265,"value":"a","file":"eval code","line":2},"file":"eval code","line":3}],"file":"eval code","line":3}]},"compile":{"outcome":"value","value":""}}, + "in switch": {"source":"{% switch a -%}\n {% case 1 -%}\n x \n{%- endswitch %}","parse":{"outcome":"value","value":[{"type":411,"expr":{"type":265,"value":"a","file":"eval code","line":1},"case_clauses":[{"type":412,"expr":{"type":258,"value":"1","file":"eval code","line":2},"file":"eval code","line":4},{"type":357,"value":"x","file":"eval code","line":4}],"file":"eval code","line":4}]},"compile":{"outcome":"value","value":"x"}}, + "in extends child": {"source":"{% extends 'a' -%}\n\n{%- block b -%} x {%- endblock -%}\n","parse":{"outcome":"value","value":[{"type":310,"path":{"type":260,"value":"a","file":"eval code","line":1},"file":"eval code","line":3},{"type":307,"name":"b","block_statements":[{"type":357,"value":"x","file":"eval code","line":3}],"file":"eval code","line":4}]},"compile":{"outcome":"throw","value":"Template file a does not exist","exception":"Phalcon\\Mvc\\View\\Engine\\Volt\\Exceptions\\TemplateFileNotFound"}} + } +} diff --git a/tests/fixtures/parity/whitespace-control.php b/tests/fixtures/parity/whitespace-control.php new file mode 100644 index 0000000..44380bc --- /dev/null +++ b/tests/fixtures/parity/whitespace-control.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +/** + * Whitespace control: `{%-` / `{{-` right-trim the raw text before the tag, + * `-%}` / `-}}` left-trim the raw text after it. The trimmed set is exactly + * space, \t, \n, \r and \v (not \0, unlike PHP's trim()). + */ + +return [ + 'echo: left' => "a {{- b }} c", + 'echo: right' => "a {{ b -}} c", + 'echo: both' => "a {{- b -}} c", + 'statement: both' => "a \n {%- if x %} y {% endif -%} \n z", + 'statement: set' => "a \n\t{%- set x = 1 -%}\n\t b", + 'statement: all whitespace' => " \t\x0B\n\r {{- a -}} \t\x0B\n\r ", + 'statement: form feed kept' => "a\x0C {{- b -}} \x0Cc", + 'statement: nul kept' => "a\0 {{- b }}", + 'adjacent tags' => "x {{- a -}}{{- b -}} y", + 'trim to nothing' => " {{- a -}} ", + 'trim between tags' => "{{ a -}} {{- b }}", + 'trim newline lines' => "{{ a -}}\n\n\n{{ b }}", + 'comment then trim' => "{# c #} {{- a }}", + 'comment after trim' => "{{ a -}} {# c #} b", + 'minus spaced not control' => "a {{ b - }} c", + 'minus before close' => "{{ a - -}}b", + 'tight minus close' => "{{ a-}}b", + 'tight minus open' => "a{{-b}}", + 'open minus number' => "a {{-1}}", + 'statement tight minus' => "a {%-if b-%} c {%-endif-%} d", + 'in for body' => "{% for a in b -%}\n {{ a }}\n{%- endfor %}", + 'in switch' => "{% switch a -%}\n {% case 1 -%}\n x \n{%- endswitch %}", + 'in extends child' => "{% extends 'a' -%}\n\n{%- block b -%} x {%- endblock -%}\n", +]; diff --git a/tests/generate-golden.php b/tests/generate-golden.php new file mode 100644 index 0000000..19df8e5 --- /dev/null +++ b/tests/generate-golden.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +/** + * Regenerates the golden files for every corpus group in + * `tests/fixtures/parity` from the cphalcon C implementation. + * + * php -d extension=phalcon tests/generate-golden.php + * + * Unlike a snapshot, the goldens are a cross-implementation reference: they + * record what ext-phalcon does, never what this package does. The script + * therefore refuses to run without the extension instead of falling back to + * the pure-PHP parser. Each golden records the extension version that + * produced it. + * + * Per case it stores the parse outcome (`Compiler::parse()`) and the compile + * outcome (`Compiler::compileString()`), each as {outcome, value, exception?}. + * Each case is written as one compact JSON line, so the files stay small even + * for deeply nested ASTs and a diff shows exactly which cases changed. + * + * PHP notices raised by cphalcon's compiler (it reads optional AST keys + * unguarded) are silenced: they are not part of either outcome. + */ + +require __DIR__ . '/../vendor/autoload.php'; + +use Phalcon\Mvc\View\Engine\Volt\Compiler as CCompiler; +use Phalcon\Tests\Support\Parity; + +if (!extension_loaded('phalcon') || !class_exists(CCompiler::class)) { + fwrite(STDERR, "ext-phalcon is not loaded; refusing to generate goldens from anything else.\n"); + fwrite(STDERR, "Run: php -d extension=phalcon tests/generate-golden.php\n"); + + exit(1); +} + +$generator = 'ext-phalcon ' . phpversion('phalcon'); +$written = 0; +$cases = 0; + +echo "Generating from {$generator} on PHP " . PHP_VERSION . "\n"; + +set_error_handler(static fn (): bool => true, E_NOTICE | E_WARNING | E_DEPRECATED); + +$encode = static fn (mixed $value): string => json_encode( + $value, + JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR, + Parity::JSON_DEPTH +); + +foreach (Parity::corpus() as $group => $sources) { + $lines = []; + + foreach ($sources as $label => $source) { + $case = [ + 'source' => $source, + 'parse' => Parity::run(static fn (string $code): mixed => (new CCompiler())->parse($code), $source), + 'compile' => Parity::run(static fn (string $code): mixed => (new CCompiler())->compileString($code), $source), + ]; + + $lines[] = ' ' . $encode((string) $label) . ': ' . $encode($case); + $cases++; + } + + $json = "{\n" + . ' "generator": ' . $encode($generator) . ",\n" + . " \"cases\": {\n" + . implode(",\n", $lines) . "\n" + . " }\n" + . "}\n"; + + file_put_contents(Parity::fixturesPath() . '/' . $group . '.json', $json); + $written++; + + echo sprintf(" %-20s %4d case(s)\n", $group, count($sources)); +} + +echo "Wrote {$written} golden file(s), {$cases} case(s).\n"; diff --git a/tests/harvest-corpus.php b/tests/harvest-corpus.php new file mode 100644 index 0000000..850243f --- /dev/null +++ b/tests/harvest-corpus.php @@ -0,0 +1,221 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +/** + * Harvests Volt snippets from existing test suites into a parity corpus. + * + * Every string literal (single, double or nowdoc/heredoc without + * interpolation, joined across `.` concatenations) that contains a Volt tag and + * no compiled PHP is collected, and so is every `*.volt` template under the + * given directories. Duplicates are dropped; the first occurrence wins, so list + * the most authoritative source (cphalcon) first. `{% cache %}` statements are + * skipped: phalcon/volt removed them on purpose, and those cases live in the + * allow-listed `cache.php` group instead. + * + * php tests/harvest-corpus.php \ + * cphalcon=/path/to/cphalcon/tests/unit/Mvc/View/Engine/Volt \ + * cphalcon-views=/path/to/cphalcon/tests/support/assets/views \ + * phalcon=/path/to/phalcon/tests/unit/Mvc/View/Engine/Volt \ + * volt=tests/unit + * + * The result is written to `tests/fixtures/parity/harvested.php` as a plain + * `label => source` array. The corpus only lists inputs; the expected output + * comes from `tests/generate-golden.php`, which runs them through ext-phalcon. + */ + +$output = __DIR__ . '/fixtures/parity/harvested.php'; + +if ($argc < 2) { + fwrite(STDERR, "usage: php tests/harvest-corpus.php label=path [label=path ...]\n"); + + exit(2); +} + +/** + * @return list + */ +function harvestFiles(string $path): array +{ + if (is_file($path)) { + return [$path]; + } + + $files = []; + $iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS) + ); + + foreach ($iterator as $file) { + /** @var SplFileInfo $file */ + $extension = $file->getExtension(); + if ($extension === 'php' || $extension === 'volt') { + $files[] = $file->getPathname(); + } + } + + sort($files); + + return $files; +} + +/** + * Evaluates one constant PHP string literal token. Only tokens the tokenizer + * classified as constant strings (or complete heredoc/nowdoc runs without + * interpolation) are ever passed here, so evaluation cannot execute code. + */ +function literalValue(string $literal): string +{ + /** @var string */ + return eval('return ' . $literal . ';'); +} + +/** + * Returns every constant string expression in a PHP file, joining literals + * that are concatenated with `.`. + * + * @return list + */ +function stringLiterals(string $code): array +{ + $tokens = token_get_all($code); + $count = count($tokens); + $strings = []; + $current = null; + $joinNext = false; + + for ($i = 0; $i < $count; $i++) { + $token = $tokens[$i]; + + if (is_array($token) && in_array($token[0], [T_WHITESPACE, T_COMMENT, T_DOC_COMMENT], true)) { + continue; + } + + $literal = null; + + if (is_array($token) && $token[0] === T_CONSTANT_ENCAPSED_STRING) { + $literal = literalValue($token[1]); + } elseif (is_array($token) && $token[0] === T_START_HEREDOC) { + $source = $token[1]; + $interpolated = false; + for ($j = $i + 1; $j < $count; $j++) { + $inner = $tokens[$j]; + $source .= is_array($inner) ? $inner[1] : $inner; + if (is_array($inner) && $inner[0] === T_END_HEREDOC) { + break; + } + if (!is_array($inner) || $inner[0] !== T_ENCAPSED_AND_WHITESPACE) { + $interpolated = true; + } + } + $i = $j; + if (!$interpolated) { + $literal = literalValue($source); + } + } + + if ($literal !== null) { + if ($joinNext && $current !== null) { + $current .= $literal; + } else { + if ($current !== null) { + $strings[] = $current; + } + $current = $literal; + } + $joinNext = false; + + continue; + } + + if ($token === '.' && $current !== null) { + $joinNext = true; + + continue; + } + + if ($current !== null) { + $strings[] = $current; + $current = null; + } + $joinNext = false; + } + + if ($current !== null) { + $strings[] = $current; + } + + return $strings; +} + +function isVoltSnippet(string $candidate): bool +{ + return preg_match('/\{[{%#]/', $candidate) === 1 + && !str_contains($candidate, ' + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Tests\Support; + +use Throwable; + +use function basename; +use function file_get_contents; +use function get_class; +use function glob; +use function in_array; +use function is_array; +use function is_file; +use function json_decode; +use function ksort; +use function sort; + +use const JSON_THROW_ON_ERROR; + +/** + * Shared plumbing for the cphalcon parity checks. + * + * The corpus lives in `tests/fixtures/parity/.php` (plain + * `label => volt source` arrays). `tests/generate-golden.php` runs every case + * through ext-phalcon and records the result in `.json`; FixturesTest + * replays the goldens against this package and `tests/differential.php` + * compares both implementations live. + * + * Every outcome is normalised to one comparable shape, so "returned an AST" + * and "threw with this message" compare with a single `===`. + * + * @phpstan-type Outcome array{outcome: 'value'|'throw', value: mixed, exception?: class-string} + */ +final class Parity +{ + public const JSON_DEPTH = 4096; + + /** + * Corpus files that are not case groups. + */ + private const NON_GROUPS = ['allow-list']; + + /** + * Expected phalcon/volt outcome for cases where phalcon/volt deliberately + * differs from cphalcon, keyed by "group/label". + * + * @return array + */ + public static function allowList(): array + { + /** @var array */ + return require self::fixturesPath() . '/allow-list.php'; + } + + /** + * Strips what is allowed to differ between implementations (the exception + * class: cphalcon throws Phalcon\Mvc\View\Exception, this package throws + * Phalcon\Volt\Exception) so the rest compares with `===`. + * + * @param array $outcome + * + * @return array{outcome: mixed, value: mixed} + */ + public static function comparable(array $outcome): array + { + return ['outcome' => $outcome['outcome'] ?? null, 'value' => $outcome['value'] ?? null]; + } + + /** + * @return array> group => label => source + */ + public static function corpus(): array + { + $groups = []; + $files = glob(self::fixturesPath() . '/*.php') ?: []; + sort($files); + + foreach ($files as $file) { + $group = basename($file, '.php'); + if (in_array($group, self::NON_GROUPS, true)) { + continue; + } + + /** @var array $cases */ + $cases = require $file; + $groups[$group] = $cases; + } + + ksort($groups); + + return $groups; + } + + public static function fixturesPath(): string + { + return __DIR__ . '/../fixtures/parity'; + } + + /** + * @return array decoded golden file for one group + */ + public static function golden(string $group): array + { + $path = self::fixturesPath() . '/' . $group . '.json'; + $json = is_file($path) ? file_get_contents($path) : false; + if ($json === false) { + return []; + } + + $decoded = json_decode($json, true, self::JSON_DEPTH, JSON_THROW_ON_ERROR); + + return is_array($decoded) ? $decoded : []; + } + + /** + * Runs a parser/compiler and normalises either outcome into one shape. + * + * @param callable(string): mixed $run + * + * @phpstan-return Outcome + */ + public static function run(callable $run, string $source): array + { + try { + return ['outcome' => 'value', 'value' => $run($source)]; + } catch (Throwable $ex) { + return [ + 'outcome' => 'throw', + 'value' => $ex->getMessage(), + 'exception' => get_class($ex), + ]; + } + } +} diff --git a/tests/unit/ParseTest.php b/tests/unit/ParseTest.php index 3476d34..8751078 100644 --- a/tests/unit/ParseTest.php +++ b/tests/unit/ParseTest.php @@ -254,7 +254,7 @@ public static function getVoltSyntaxErrors(): array {% endfor %} ', - 'Syntax error, unexpected token ~(id) in eval code on line 4', + 'Syntax error, unexpected token ~ in eval code on line 4', ], [ '\'{{ link_to("album/" ~ album.id ~ "/" ~ $album.uri, ' . diff --git a/tests/unit/Parser/FixturesTest.php b/tests/unit/Parser/FixturesTest.php new file mode 100644 index 0000000..67db368 --- /dev/null +++ b/tests/unit/Parser/FixturesTest.php @@ -0,0 +1,80 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Tests\Unit\Parser; + +use Phalcon\Tests\Support\Parity; +use Phalcon\Volt\Parser\Parser; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\TestCase; + +use function is_array; + +/** + * Replays every case of the parity corpus against the golden outcome recorded + * from ext-phalcon by `tests/generate-golden.php`. + * + * `assertSame()` rather than `assertEquals()`: key order and int/string types + * are part of the AST format, and only an identity comparison notices drift. + * Exceptions compare by message only - cphalcon throws + * Phalcon\Mvc\View\Exception, this package Phalcon\Volt\Exception. + * + * Cases in `allow-list.php` are deliberate phalcon/volt divergences (e.g. the + * removed `{% cache %}` statement) and are checked against their recorded + * phalcon/volt expectation instead of the C golden. + */ +final class FixturesTest extends TestCase +{ + /** + * @return array + */ + public static function goldenProvider(): array + { + $allowList = Parity::allowList(); + $cases = []; + + foreach (Parity::corpus() as $group => $sources) { + $golden = Parity::golden($group); + /** @var array> $goldenCases */ + $goldenCases = is_array($golden['cases'] ?? null) ? $golden['cases'] : []; + + foreach ($sources as $label => $source) { + $key = $group . '/' . $label; + if (isset($allowList[$key])) { + $expected = Parity::comparable($allowList[$key]); + } else { + /** @var array $parse */ + $parse = $goldenCases[$label]['parse'] ?? ['outcome' => 'missing golden', 'value' => null]; + $expected = Parity::comparable($parse); + } + + $cases[$key] = [$source, $expected]; + } + } + + return $cases; + } + + /** + * @param array{outcome: mixed, value: mixed} $expected + */ + #[DataProvider('goldenProvider')] + public function testParseMatchesCphalcon(string $source, array $expected): void + { + $actual = Parity::comparable( + Parity::run(static fn (string $code): array => (new Parser())->parse($code), $source) + ); + + $this->assertSame($expected, $actual); + } +} diff --git a/tests/unit/Parser/LongListTest.php b/tests/unit/Parser/LongListTest.php new file mode 100644 index 0000000..0bcadca --- /dev/null +++ b/tests/unit/Parser/LongListTest.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Tests\Unit\Parser; + +use Phalcon\Volt\Compiler; +use Phalcon\Volt\Parser\Parser; +use PHPUnit\Framework\TestCase; + +use function array_fill; +use function count; +use function implode; +use function microtime; +use function str_repeat; +use function substr_count; + +/** + * Long flat lists must parse in linear time and must not count towards the + * nesting limit: the grammar's lists are left-recursive, so cphalcon keeps + * them in one parser stack entry however long they grow. + */ +final class LongListTest extends TestCase +{ + /** + * cphalcon tests/unit/Mvc/View/Engine/Volt/Compiler/CompileStringTest.php + */ + public function testLargeArrayLiteralCompilesQuickly(): void + { + $count = 40000; + $template = '{{ [' . implode(',', array_fill(0, $count, '1')) . '] }}'; + + $start = microtime(true); + $actual = (new Compiler())->compileString($template); + $spent = microtime(true) - $start; + + $this->assertSame($count - 1, substr_count($actual, ', 1')); + $this->assertLessThan(3.0, $spent); + } + + public function testManyAssignmentsParse(): void + { + $statements = (new Parser())->parse('{% set ' . implode(', ', array_fill(0, 3000, 'a = 1')) . ' %}'); + + $this->assertSame(3000, count($statements[0]['assignments'])); + } + + public function testManyStatementsParse(): void + { + $statements = (new Parser())->parse(str_repeat('{{ a }}x', 5000)); + + $this->assertSame(10000, count($statements)); + } +} diff --git a/tests/unit/Parser/PrecedenceTest.php b/tests/unit/Parser/PrecedenceTest.php new file mode 100644 index 0000000..094f9e6 --- /dev/null +++ b/tests/unit/Parser/PrecedenceTest.php @@ -0,0 +1,127 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Tests\Unit\Parser; + +use Phalcon\Volt\Compiler\Opcode; +use Phalcon\Volt\Parser\Parser; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\TestCase; + +use function array_is_list; +use function implode; +use function in_array; +use function is_array; + +/** + * Operator grouping, written as s-expressions so the counter-intuitive parts + * of the Lemon precedence table (parser.php.lemon lines 22-36) are readable: + * `*` binds looser than `+`, prefix `!` binds tighter than `[`, `not in` binds + * tighter than `in`, and the ternary groups to the left. + * + * The exact ASTs are pinned against ext-phalcon by FixturesTest + * (`precedence` group); this test documents the shape. + */ +final class PrecedenceTest extends TestCase +{ + /** + * @return array + */ + public static function groupingProvider(): array + { + return [ + 'plus binds tighter than times' => ['1 + 2 * 3', '(MUL (ADD 1 2) 3)'], + 'times then plus' => ['1 * 2 + 3', '(MUL 1 (ADD 2 3))'], + 'access binds tighter than plus' => ['a + b[0]', '(ADD a (ARRAYACCESS b 0))'], + 'access binds tighter than times' => ['a * b[0]', '(MUL a (ARRAYACCESS b 0))'], + 'dot binds tighter than access' => ['a.b[0]', '(ARRAYACCESS (DOT a b) 0)'], + 'dot binds tighter than call' => ['a.b(c)', '(FCALL (DOT a b) c)'], + 'not binds tighter than access' => ['!a[0]', '(ARRAYACCESS (NOT a) 0)'], + 'dot binds tighter than not' => ['!a.b', '(NOT (DOT a b))'], + 'call binds tighter than not' => ['!a(x)', '(NOT (FCALL a x))'], + 'not binds tighter than pipe' => ['!a|f', '(PIPE (NOT a) f)'], + 'dot binds tighter than minus' => ['-a.b', '(MINUS (DOT a b))'], + 'minus binds tighter than times' => ['-a * b', '(MUL (MINUS a) b)'], + 'call binds tighter than pipe' => ['a|f(x)', '(PIPE a (FCALL f x))'], + 'pipe binds tighter than access' => ['a|f[0]', '(ARRAYACCESS (PIPE a f) 0)'], + 'not in binds tighter than plus' => ['a not in b + c', '(ADD (NOT_IN a b) c)'], + 'plus then not in' => ['a + b not in c', '(ADD a (NOT_IN b c))'], + 'in binds looser than plus' => ['a in b + c', '(IN a (ADD b c))'], + 'ternary groups left' => ['a ? b : c ? d : e', '(TERNARY (TERNARY a b c) d e)'], + 'ternary middle is full' => ['a ? b ? c : d : e', '(TERNARY a (TERNARY b c d) e)'], + 'range binds looser than plus' => ['a .. b + c', '(RANGE a (ADD b c))'], + 'is defined then and' => ['a is defined and b', '(AND (ISSET a) b)'], + 'is binds looser than plus' => ['a is b + c', '(IS a (ADD b c))'], + 'concat binds tighter than eq' => ['a ~ b == c', '(EQUALS (CONCAT a b) c)'], + 'pow is left associative' => ['2**3**2', '(POW (POW 2 3) 2)'], + 'plus binds tighter than pow' => ['2 + 3 ** 4', '(POW (ADD 2 3) 4)'], + 'not over not in' => ['not a not in b', '(NOT (NOT_IN a b))'], + 'not in is right associative' => ['a not in b not in c', '(NOT_IN a (NOT_IN b c))'], + 'not in binds tighter than access' => ['a not in b[0]', '(ARRAYACCESS (NOT_IN a b) 0)'], + 'call binds tighter than not in' => ['a not in b(1)', '(NOT_IN a (FCALL b 1))'], + 'incr binds tighter than minus' => ['-a++', '(MINUS (INCR a))'], + 'dot binds tighter than incr' => ['a.b++', '(INCR (DOT a b))'], + 'dot takes a prefix operand' => ['a.-b*c', '(MUL (DOT a (MINUS b)) c)'], + 'test applies to comparison' => ['x == a is defined', '(ISSET (EQUALS x a))'], + 'floor division is mod' => ['a // b', '(MOD a b)'], + 'and or same level' => ['a or b and c', '(AND (OR a b) c)'], + ]; + } + + /** + * Renders an expression node as `(OPCODE child...)`, children in AST key + * order; literals render as their value. + */ + private static function sexpr(mixed $node): string + { + if (!is_array($node)) { + return (string) $node; + } + + if (isset($node['value'])) { + return $node['type'] === Opcode::STRING->value ? '"' . $node['value'] . '"' : (string) $node['value']; + } + + if (!isset($node['type'])) { + return (isset($node['name']) ? $node['name'] . ': ' : '') . self::sexpr($node['expr']); + } + + $parts = [Opcode::from($node['type'])->name]; + + foreach ($node as $key => $child) { + if (in_array($key, ['type', 'file', 'line'], true)) { + continue; + } + + if (is_array($child) && array_is_list($child)) { + foreach ($child as $item) { + $parts[] = self::sexpr($item); + } + + continue; + } + + $parts[] = self::sexpr($child); + } + + return '(' . implode(' ', $parts) . ')'; + } + + #[DataProvider('groupingProvider')] + public function testGrouping(string $expression, string $expected): void + { + $statements = (new Parser())->parse('{{ ' . $expression . ' }}'); + + $this->assertSame($expected, self::sexpr($statements[0]['expr'])); + } +} diff --git a/tests/unit/Parser/StatusTest.php b/tests/unit/Parser/StatusTest.php deleted file mode 100644 index fe80482..0000000 --- a/tests/unit/Parser/StatusTest.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE.txt - * file that was distributed with this source code. - */ - -declare(strict_types=1); - -namespace Phalcon\Tests\Unit\Parser; - -use Phalcon\Volt\Parser\Status; -use Phalcon\Volt\Scanner\State; -use Phalcon\Volt\Scanner\Token; -use PHPUnit\Framework\TestCase; - -final class StatusTest extends TestCase -{ - public function testConstants(): void - { - $this->assertSame(0, Status::PHVOLT_PARSING_FAILED); - $this->assertSame(1, Status::PHVOLT_PARSING_OK); - } - - public function testDefaultStatus(): void - { - $state = new State('test'); - $status = new Status($state); - - $this->assertSame(Status::PHVOLT_PARSING_OK, $status->getStatus()); - $this->assertNull($status->getSyntaxError()); - $this->assertNull($status->getToken()); - $this->assertSame($state, $status->getState()); - } - - public function testSetStatus(): void - { - $state = new State('test'); - $status = new Status($state); - - $result = $status->setStatus(Status::PHVOLT_PARSING_FAILED); - $this->assertSame(Status::PHVOLT_PARSING_FAILED, $status->getStatus()); - $this->assertInstanceOf(Status::class, $result); - } - - public function testSetSyntaxError(): void - { - $state = new State('test'); - $status = new Status($state); - - $status->setSyntaxError('Unexpected token'); - $this->assertSame('Unexpected token', $status->getSyntaxError()); - } - - public function testSetToken(): void - { - $state = new State('test'); - $status = new Status($state); - $token = new Token(42, 'hello'); - - $status->setToken($token); - $this->assertSame($token, $status->getToken()); - } -} diff --git a/tests/unit/Scanner/OpcodeTest.php b/tests/unit/Scanner/OpcodeTest.php deleted file mode 100644 index c613876..0000000 --- a/tests/unit/Scanner/OpcodeTest.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE.txt - * file that was distributed with this source code. - */ - -declare(strict_types=1); - -namespace Phalcon\Tests\Unit\Scanner; - -use Phalcon\Volt\Scanner\Opcode; -use PHPUnit\Framework\TestCase; - -final class OpcodeTest extends TestCase -{ - public function testKeyOpcodeValues(): void - { - $this->assertSame(1, Opcode::OPEN_DELIMITER->value); - $this->assertSame(2, Opcode::COMMA->value); - $this->assertSame(6, Opcode::AND->value); - $this->assertSame(7, Opcode::OR->value); - $this->assertSame(9, Opcode::IS->value); - $this->assertSame(21, Opcode::PLUS->value); - $this->assertSame(22, Opcode::MINUS->value); - $this->assertSame(31, Opcode::IF->value); - $this->assertSame(37, Opcode::FOR->value); - $this->assertSame(38, Opcode::IDENTIFIER->value); - $this->assertSame(51, Opcode::MACRO->value); - $this->assertSame(54, Opcode::INTEGER->value); - $this->assertSame(55, Opcode::STRING->value); - $this->assertSame(56, Opcode::DOUBLE->value); - $this->assertSame(77, Opcode::RAW_FRAGMENT->value); - } - - public function testLabelFallsBackToName(): void - { - $this->assertSame('INTEGER', Opcode::INTEGER->label()); - $this->assertSame('IDENTIFIER', Opcode::IDENTIFIER->label()); - $this->assertSame('FOR', Opcode::FOR->label()); - } - - public function testLabelMultiCharOperators(): void - { - $this->assertSame('{%', Opcode::OPEN_DELIMITER->label()); - $this->assertSame('%}', Opcode::CLOSE_DELIMITER->label()); - $this->assertSame('{{', Opcode::OPEN_EDELIMITER->label()); - $this->assertSame('}}', Opcode::CLOSE_EDELIMITER->label()); - $this->assertSame('!=', Opcode::NOTEQUALS->label()); - $this->assertSame('===', Opcode::IDENTICAL->label()); - $this->assertSame('!==', Opcode::NOTIDENTICAL->label()); - $this->assertSame('<=', Opcode::LESSEQUAL->label()); - $this->assertSame('>=', Opcode::GREATEREQUAL->label()); - $this->assertSame('+=', Opcode::ADD_ASSIGN->label()); - $this->assertSame('-=', Opcode::SUB_ASSIGN->label()); - $this->assertSame('*=', Opcode::MUL_ASSIGN->label()); - $this->assertSame('/=', Opcode::DIV_ASSIGN->label()); - $this->assertSame('++', Opcode::INCR->label()); - $this->assertSame('--', Opcode::DECR->label()); - } - - public function testLabelSingleCharOperators(): void - { - $this->assertSame('+', Opcode::PLUS->label()); - $this->assertSame('-', Opcode::MINUS->label()); - $this->assertSame('*', Opcode::TIMES->label()); - $this->assertSame('/', Opcode::DIVIDE->label()); - $this->assertSame('%', Opcode::MOD->label()); - $this->assertSame('.', Opcode::DOT->label()); - $this->assertSame(',', Opcode::COMMA->label()); - $this->assertSame(':', Opcode::COLON->label()); - $this->assertSame('?', Opcode::QUESTION->label()); - $this->assertSame('~', Opcode::CONCAT->label()); - $this->assertSame('|', Opcode::PIPE->label()); - $this->assertSame('(', Opcode::PARENTHESES_OPEN->label()); - $this->assertSame(')', Opcode::PARENTHESES_CLOSE->label()); - $this->assertSame('[', Opcode::SBRACKET_OPEN->label()); - $this->assertSame(']', Opcode::SBRACKET_CLOSE->label()); - $this->assertSame('{', Opcode::CBRACKET_OPEN->label()); - $this->assertSame('}', Opcode::CBRACKET_CLOSE->label()); - } -} diff --git a/tests/unit/Scanner/ScannerTest.php b/tests/unit/Scanner/ScannerTest.php new file mode 100644 index 0000000..188aa3a --- /dev/null +++ b/tests/unit/Scanner/ScannerTest.php @@ -0,0 +1,437 @@ + + * + * For the full copyright and license information, please view the LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Phalcon\Tests\Unit\Scanner; + +use Phalcon\Volt\Compiler\Opcode; +use Phalcon\Volt\Scanner\Scanner; +use Phalcon\Volt\Scanner\ScannerStatus; +use Phalcon\Volt\Scanner\State; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\TestCase; + +/** + * The scanner's token contract, rule by rule from cphalcon's scanner.re: + * the opcode, the value and the line counter after each token. + */ +final class ScannerTest extends TestCase +{ + private const DELIMITERS = ['OPEN_DELIMITER', 'CLOSE_DELIMITER', 'OPEN_EDELIMITER', 'CLOSE_EDELIMITER']; + + /** + * @return array}> + */ + public static function isNotProvider(): array + { + $isNot = ['NOTEQUALS', null]; + $a = ['IDENTIFIER', 'a']; + $b = ['IDENTIFIER', 'b']; + + return [ + 'one space' => ['{{ a is not b }}', [$a, $isNot, $b]], + 'one space upper' => ['{{ a IS NOT b }}', [$a, $isNot, $b]], + 'two spaces' => ['{{ a is not b }}', [$a, $isNot, $b]], + 'two spaces upper' => ['{{ a IS NOT b }}', [$a, ['IS', null], ['NOT', null], $b]], + 'longest match wins' => ['{{ a is nothing }}', [$a, $isNot, ['IDENTIFIER', 'hing']]], + 'plain is' => ['{{ a is b }}', [$a, ['IS', null], $b]], + ]; + } + + /** + * @return array + */ + public static function scanningErrorProvider(): array + { + return [ + 'unknown byte' => ['{{ $ }}', 4], + 'unterminated string' => ['{{ "abc', 4], + 'trailing backslash' => ["{{ 'abc\\", 4], + 'backslash newline' => ["{{ 'a\\\nb' }}", 4], + 'lone backslash' => ['{{ \\ }}', 4], + 'vertical tab in code' => ["{{ \x0B }}", 4], + ]; + } + + public function testCacheIsAnIdentifier(): void + { + $this->assertSame( + [['IDENTIFIER', 'cache'], ['IDENTIFIER', 'endcache']], + $this->codeTokens('{{ cache endcache }}') + ); + } + + public function testCommentContainingZeroIsSkipped(): void + { + $this->assertSame( + [['RAW_FRAGMENT', 'x', 1], ['EOF', null, 1]], + $this->scan('{# 0 #}x') + ); + } + + public function testCommentDoesNotFlushRawBuffer(): void + { + $this->assertSame( + [['RAW_FRAGMENT', 'ab', 1], ['EOF', null, 1]], + $this->scan('a{# c #}b') + ); + } + + public function testCommentNewlinesAreCounted(): void + { + $this->assertSame( + [ + ['OPEN_EDELIMITER', null, 3], + ['IDENTIFIER', 'c', 3], + ['CLOSE_EDELIMITER', null, 3], + ['EOF', null, 3], + ], + $this->scan("{# a\n\nb #}{{ c }}") + ); + } + + public function testCommentOwnHashCanCloseIt(): void + { + $this->assertSame( + [['RAW_FRAGMENT', 'x', 1], ['EOF', null, 1]], + $this->scan('{#}x') + ); + } + + public function testDashAfterOpenDelimiterIsWhitespaceControl(): void + { + $this->assertSame( + [['RAW_FRAGMENT', 'a'], ['OPEN_EDELIMITER', null], ['INTEGER', '1'], ['CLOSE_EDELIMITER', null]], + $this->codeTokens('a {{-1}}', []) + ); + } + + public function testDefaultKeepsItsSpelling(): void + { + $this->assertSame([['DEFAULT', 'DeFault']], $this->codeTokens('{{ DeFault }}')); + } + + public function testDoubleStarAndSlashAreTwoTokens(): void + { + $this->assertSame( + [ + ['IDENTIFIER', 'a'], ['MUL', null], ['MUL', null], + ['IDENTIFIER', 'b'], ['DIV', null], ['DIV', null], + ['IDENTIFIER', 'c'], + ], + $this->codeTokens('{{ a ** b // c }}') + ); + } + + public function testEmptyVerbatimHasNoFragment(): void + { + $this->assertSame( + [['VERBATIM', null], ['ENDVERBATIM', null]], + $this->codeTokens('{% verbatim %}{% endverbatim %}', ['OPEN_DELIMITER', 'CLOSE_DELIMITER']) + ); + } + + /** + * @param list $expected + */ + #[DataProvider('isNotProvider')] + public function testIsNotSpellings(string $code, array $expected): void + { + $this->assertSame($expected, $this->codeTokens($code)); + } + + public function testKeywordsAreCaseInsensitive(): void + { + $this->assertSame( + [['IF', null], ['IDENTIFIER', 'a'], ['ENDIF', null], ['TRUE', null], ['AND', null]], + $this->codeTokens('{% IF a %}{% EndIf %}{{ True AnD }}') + ); + } + + public function testLeftTrimCrossesAComment(): void + { + $this->assertSame( + [['IDENTIFIER', 'a'], ['RAW_FRAGMENT', 'x']], + $this->codeTokens('{{ a -}} {# c #} x') + ); + } + + public function testLongerIdentifierBeatsKeyword(): void + { + $this->assertSame( + [['IDENTIFIER', 'iffy'], ['IDENTIFIER', 'nullable'], ['IDENTIFIER', 'if\\x']], + $this->codeTokens('{{ iffy nullable if\\x }}') + ); + } + + public function testNewlinesInCodeAreCounted(): void + { + $this->assertSame( + [['IDENTIFIER', 'a', 1], ['IDENTIFIER', 'b', 3]], + $this->lineTokens("{{ a\n\nb }}", ['IDENTIFIER']) + ); + } + + public function testNewlinesInsideStringsAreNotCounted(): void + { + $this->assertSame( + [['STRING', "a\nb", 1], ['IDENTIFIER', 'c', 2]], + $this->lineTokens("{{ 'a\nb' }}\n{{ c }}", ['STRING', 'IDENTIFIER']) + ); + } + + public function testNulByteEndsTheScan(): void + { + $this->assertSame( + [['RAW_FRAGMENT', 'x', 1], ['EOF', null, 1]], + $this->scan("x\0y{{ z }}") + ); + } + + public function testNumbers(): void + { + $this->assertSame( + [ + ['DOUBLE', '1.5'], + ['INTEGER', '1'], ['DOT', null], + ['INTEGER', '1'], ['RANGE', null], ['INTEGER', '2'], + ['INTEGER', '007'], + ], + $this->codeTokens('{{ 1.5 1. 1..2 007 }}') + ); + } + + public function testOpeningTagCancelsPendingLeftTrim(): void + { + $this->assertSame( + [['IDENTIFIER', 'a'], ['IDENTIFIER', 'b'], ['RAW_FRAGMENT', ' c']], + $this->codeTokens('{{ a -}}{{ b }} c') + ); + } + + public function testOperatorsTakeTheLongestMatch(): void + { + $this->assertSame( + [ + ['IDENTICAL', null], ['NOTIDENTICAL', null], ['NOTEQUALS', null], ['NOTEQUALS', null], + ['LESSEQUAL', null], ['GREATEREQUAL', null], ['INCR', null], ['DECR', null], + ['ADD_ASSIGN', null], ['SUB_ASSIGN', null], ['MUL_ASSIGN', null], ['DIV_ASSIGN', null], + ['RANGE', null], ['EQUALS', null], ['ASSIGN', null], ['NOT', null], + ], + $this->codeTokens('{{ === !== != <> <= >= ++ -- += -= *= /= .. == = ! }}') + ); + } + + public function testRawTextIsOneFragment(): void + { + $this->assertSame( + [['RAW_FRAGMENT', "a\nb", 2], ['EOF', null, 2]], + $this->scan("a\nb") + ); + } + + #[DataProvider('scanningErrorProvider')] + public function testScanningErrorMovesPastTheOffendingByte(string $code, int $cursor): void + { + $state = new State($code); + $scanner = new Scanner($state); + + do { + $status = $scanner->scanForToken(); + $state->setActiveToken($scanner->getToken()->opcode); + } while ($status === ScannerStatus::OK); + + $this->assertSame([ScannerStatus::ERR, $cursor], [$status, $state->getCursor()]); + } + + public function testSetAfterDotAndWhitespaceIsKeyword(): void + { + $this->assertSame( + [['IDENTIFIER', 'a'], ['DOT', null], ['SET', null]], + $this->codeTokens('{{ a. set }}') + ); + } + + public function testSetAndIsDirectlyAfterDotAreIdentifiers(): void + { + $this->assertSame( + [['IDENTIFIER', 'a'], ['DOT', null], ['IDENTIFIER', 'set'], ['DOT', null], ['IDENTIFIER', 'IS']], + $this->codeTokens('{{ a.set.IS }}') + ); + } + + public function testStatementPositionCountsStatementKeywords(): void + { + $state = new State('{{ a }}{% if b is not c and not d is defined %}'); + $scanner = new Scanner($state); + + while ($scanner->scanForToken() === ScannerStatus::OK) { + $state->setActiveToken($scanner->getToken()->opcode); + } + + // {{, if, is not, not, is, defined + $this->assertSame(6, $state->getStatementPosition()); + } + + public function testStringsKeepTheirEscapes(): void + { + $this->assertSame( + [['STRING', 'a\\"b'], ['STRING', "it\\'s"], ['STRING', '']], + $this->codeTokens('{{ "a\\"b" \'it\\\'s\' "" }}') + ); + } + + public function testUnclosedVerbatimFlushesAtTheEnd(): void + { + $this->assertSame( + [['VERBATIM', null], ['RAW_FRAGMENT', "x\n"], ['EOF', null]], + $this->codeTokens("{% verbatim %}x\n", ['OPEN_DELIMITER', 'CLOSE_DELIMITER'], true) + ); + } + + public function testUnterminatedCommentEndsTheScan(): void + { + $this->assertSame([['EOF', null, 2]], $this->scan("a{# b\n")); + } + + public function testVerbatimCapturesTagsLiterally(): void + { + $this->assertSame( + [ + ['OPEN_DELIMITER', null], ['VERBATIM', null], ['CLOSE_DELIMITER', null], + ['RAW_FRAGMENT', '{{ a }}{% if %}'], + ['OPEN_DELIMITER', null], ['ENDVERBATIM', null], ['CLOSE_DELIMITER', null], + ], + $this->codeTokens('{% verbatim %}{{ a }}{% if %}{% endverbatim %}', []) + ); + } + + public function testVerbatimEndTagIgnoresCaseSpacingAndDash(): void + { + $this->assertSame( + [['RAW_FRAGMENT', 'x'], ['ENDVERBATIM', null]], + $this->codeTokens( + "{% verbatim %}x{%- \n ENDVERBATIM %}", + ['OPEN_DELIMITER', 'CLOSE_DELIMITER', 'VERBATIM'] + ) + ); + } + + public function testVerbatimEndTagMustBeAWholeWord(): void + { + $this->assertSame( + [['RAW_FRAGMENT', 'a{% endverbatimx %}b'], ['ENDVERBATIM', null]], + $this->codeTokens( + '{% verbatim %}a{% endverbatimx %}b{% endverbatim %}', + ['OPEN_DELIMITER', 'CLOSE_DELIMITER', 'VERBATIM'] + ) + ); + } + + public function testWhitespaceControlKeepsFormFeed(): void + { + $this->assertSame( + [['RAW_FRAGMENT', "a\x0C"], ['IDENTIFIER', 'b']], + $this->codeTokens("a\x0C {{- b }}") + ); + } + + public function testWhitespaceControlTrimsBothSides(): void + { + $this->assertSame( + [['RAW_FRAGMENT', 'a'], ['IDENTIFIER', 'b'], ['RAW_FRAGMENT', 'c']], + $this->codeTokens("a \t\n {{- b -}} \x0B\r c") + ); + } + + /** + * Tokens without lines, IGNORE and the given opcodes (delimiters by + * default), and without the final status unless asked for. + * + * @param list $skip + * + * @return list + */ + private function codeTokens(string $code, array $skip = self::DELIMITERS, bool $withStatus = false): array + { + $tokens = []; + + foreach ($this->tokenize($code) as [$name, $value]) { + $isStatus = $name === 'EOF' || $name === 'ERR'; + if ($name === 'IGNORE' || in_array($name, $skip, true) || ($isStatus && !$withStatus)) { + continue; + } + $tokens[] = [$name, $value]; + } + + return $tokens; + } + + /** + * @param list $only + * + * @return list + */ + private function lineTokens(string $code, array $only): array + { + $tokens = []; + + foreach ($this->tokenize($code) as [$name, $value, $line]) { + if (in_array($name, $only, true)) { + $tokens[] = [$name, $value, $line]; + } + } + + return $tokens; + } + + /** + * Every token including the final status, as [name, value, line after]. + * + * @return list + */ + private function scan(string $code): array + { + $tokens = []; + + foreach ($this->tokenize($code) as [$name, $value, $line]) { + if ($name !== 'IGNORE') { + $tokens[] = [$name, $value, $line]; + } + } + + return $tokens; + } + + /** + * Drives the scanner the way the parser driver does: the active token is + * updated after every token, IGNORE included (base.c line 303). + * + * @return list + */ + private function tokenize(string $code): array + { + $state = new State($code); + $scanner = new Scanner($state); + $tokens = []; + + while (($status = $scanner->scanForToken()) === ScannerStatus::OK) { + $token = $scanner->getToken(); + $state->setActiveToken($token->opcode); + $tokens[] = [Opcode::from($token->opcode)->name, $token->value, $state->getActiveLine()]; + } + + $tokens[] = [$status->name, null, $state->getActiveLine()]; + + return $tokens; + } +} diff --git a/tests/unit/Scanner/StateTest.php b/tests/unit/Scanner/StateTest.php index 1d5c663..691a093 100644 --- a/tests/unit/Scanner/StateTest.php +++ b/tests/unit/Scanner/StateTest.php @@ -13,174 +13,64 @@ namespace Phalcon\Tests\Unit\Scanner; +use Phalcon\Volt\Scanner\Mode; use Phalcon\Volt\Scanner\State; use PHPUnit\Framework\TestCase; final class StateTest extends TestCase { - public function testConstructorDefaults(): void + public function testCountersIncrement(): void { - $state = new State('hello'); + $state = (new State('')) + ->incrementActiveLine() + ->incrementActiveLine(3) + ->incrementStatementPosition() + ->incrementStatementPosition(); - $this->assertSame('hello', $state->getRawBuffer()); - $this->assertSame(5, $state->getStartLength()); - $this->assertSame('eval code', $state->getActiveFile()); - $this->assertSame(1, $state->getActiveLine()); - $this->assertSame(0, $state->getCursor()); - $this->assertSame(0, $state->getBlockLevel()); - $this->assertSame(0, $state->getExtendsMode()); - $this->assertSame(0, $state->getForLevel()); - $this->assertSame(0, $state->getForcedRawState()); - $this->assertSame(0, $state->getIfLevel()); - $this->assertSame(0, $state->getMacroLevel()); - $this->assertSame(0, $state->getOldIfLevel()); - $this->assertSame(0, $state->getStatementPosition()); - $this->assertSame(0, $state->getSwitchLevel()); - $this->assertSame('', $state->getRawFragment()); - $this->assertSame(0, $state->getRawBufferCursor()); - $this->assertNull($state->getActiveToken()); - $this->assertFalse($state->getWhitespaceControl()); + $this->assertSame([5, 2], [$state->getActiveLine(), $state->getStatementPosition()]); } - public function testGetPrevious(): void + public function testSettersAreFluent(): void { - $state = new State('hello'); - $state->setCursor(2); - - $this->assertSame('e', $state->getPrevious()); - $this->assertSame('h', $state->getPrevious(2)); - $this->assertNull($state->getPrevious(10)); - } - - public function testIncrementMethods(): void - { - $state = new State('abc'); - - $state->incrementBlockLevel(); - $this->assertSame(1, $state->getBlockLevel()); - - $state->decrementBlockLevel(); - $this->assertSame(0, $state->getBlockLevel()); - - $state->incrementIfLevel(); - $this->assertSame(1, $state->getIfLevel()); - - $state->decrementIfLevel(); - $this->assertSame(0, $state->getIfLevel()); - - $state->incrementForLevel(); - $this->assertSame(1, $state->getForLevel()); - - $state->decrementForLevel(); - $this->assertSame(0, $state->getForLevel()); - - $state->incrementMacroLevel(); - $this->assertSame(1, $state->getMacroLevel()); - - $state->decrementMacroLevel(); - $this->assertSame(0, $state->getMacroLevel()); - - $state->incrementSwitchLevel(); - $this->assertSame(1, $state->getSwitchLevel()); - - $state->decrementSwitchLevel(); - $this->assertSame(0, $state->getSwitchLevel()); - - $state->incrementStatementPosition(); - $this->assertSame(1, $state->getStatementPosition()); - - $state->incrementForcedRawState(); - $this->assertSame(1, $state->getForcedRawState()); - - $state->decrementForcedRawState(); - $this->assertSame(0, $state->getForcedRawState()); - } - - public function testIncrementRawBufferCursor(): void - { - $state = new State('test'); - - $this->assertSame(0, $state->getRawBufferCursor()); - $state->incrementRawBufferCursor(); - $this->assertSame(1, $state->getRawBufferCursor()); - $state->incrementRawBufferCursor(); - $this->assertSame(2, $state->getRawBufferCursor()); - } - - public function testSetActiveLine(): void - { - $state = new State('test'); - - $this->assertSame(1, $state->getActiveLine()); - $state->setActiveLine(5); - $this->assertSame(5, $state->getActiveLine()); + $state = (new State('')) + ->setCursor(3) + ->setMode(Mode::VERBATIM) + ->setActiveToken(46) + ->setRawFragment('ab') + ->appendToRawFragment('c') + ->setVerbatim(true) + ->setWhitespaceControl(true); + + $this->assertSame( + [3, Mode::VERBATIM, 46, 'abc', true, true], + [ + $state->getCursor(), + $state->getMode(), + $state->getActiveToken(), + $state->getRawFragment(), + $state->isVerbatim(), + $state->getWhitespaceControl(), + ] + ); } - public function testSetMarkerCursor(): void + public function testStartsAtTheBeginningInRawMode(): void { - $state = new State('hello world'); - - $state->setMarkerCursor(3); - $this->assertSame(3, $state->getCursor()); - } - - public function testSetRawBuffer(): void - { - $state = new State('original'); - - $state->setRawBuffer('replacement'); - $this->assertSame('replacement', $state->getRawBuffer()); - } - - public function testSetRawBufferCursor(): void - { - $state = new State('test'); - - $state->setRawBufferCursor(5); - $this->assertSame(5, $state->getRawBufferCursor()); - } - - public function testSettersAndGetters(): void - { - $state = new State('test'); - - $state->setBlockLevel(2); - $this->assertSame(2, $state->getBlockLevel()); - - $state->setExtendsMode(1); - $this->assertSame(1, $state->getExtendsMode()); - - $state->setForLevel(3); - $this->assertSame(3, $state->getForLevel()); - - $state->setForcedRawState(1); - $this->assertSame(1, $state->getForcedRawState()); - - $state->setIfLevel(1); - $this->assertSame(1, $state->getIfLevel()); - - $state->setMacroLevel(1); - $this->assertSame(1, $state->getMacroLevel()); - - $state->setOldIfLevel(2); - $this->assertSame(2, $state->getOldIfLevel()); - - $state->setStatementPosition(5); - $this->assertSame(5, $state->getStatementPosition()); - - $state->setSwitchLevel(1); - $this->assertSame(1, $state->getSwitchLevel()); - - $state->setRawFragment('hello'); - $this->assertSame('hello', $state->getRawFragment()); - - $state->appendToRawFragment(' world'); - $this->assertSame('hello world', $state->getRawFragment()); - - $state->setActiveToken(42); - $this->assertSame(42, $state->getActiveToken()); - - $state->setWhitespaceControl(true); - $this->assertTrue($state->getWhitespaceControl()); + $state = new State('{{ a }}'); + + $this->assertSame( + ['{{ a }}', 0, Mode::RAW, 1, null, 0, '', false, false], + [ + $state->getCode(), + $state->getCursor(), + $state->getMode(), + $state->getActiveLine(), + $state->getActiveToken(), + $state->getStatementPosition(), + $state->getRawFragment(), + $state->isVerbatim(), + $state->getWhitespaceControl(), + ] + ); } } diff --git a/tests/unit/Scanner/TokenTest.php b/tests/unit/Scanner/TokenTest.php index ef52fb8..ffadf16 100644 --- a/tests/unit/Scanner/TokenTest.php +++ b/tests/unit/Scanner/TokenTest.php @@ -13,41 +13,33 @@ namespace Phalcon\Tests\Unit\Scanner; +use Error; use Phalcon\Volt\Scanner\Token; use PHPUnit\Framework\TestCase; final class TokenTest extends TestCase { - public function testConstructorWithAllArgs(): void + public function testDefaultsToEndOfInputWithoutValue(): void { - $token = new Token(42, 'hello', 5); + $token = new Token(); - $this->assertSame(42, $token->opcode); - $this->assertSame('hello', $token->value); - $this->assertSame(5, $token->length); + $this->assertSame([0, null], [$token->opcode, $token->value]); } - public function testDefaultValues(): void + public function testHoldsOpcodeAndValue(): void { - $token = new Token(); + $token = new Token(265, 'name'); - $this->assertSame(0, $token->opcode); - $this->assertNull($token->value); - $this->assertSame(0, $token->length); + $this->assertSame([265, 'name'], [$token->opcode, $token->value]); } public function testIsReadonly(): void { - $token = new Token(1, 'test', 4); + $token = new Token(265, 'name'); - $this->expectException(\Error::class); - $token->opcode = 2; // @phpstan-ignore-line - } - - public function testLengthDefaultsToStringLengthWhenValueProvided(): void - { - $token = new Token(1, 'world'); + $this->expectException(Error::class); - $this->assertSame(5, $token->length); + /** @phpstan-ignore-next-line - asserting the readonly guard */ + $token->opcode = 1; } }