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:
-**
-** A FILE* to which trace output should be written.
-** If NULL, then tracing is turned off.
-** A prefix string written at the beginning of every
-** line of trace output. If NULL, then tracing is
-** turned off.
-**
-**
-** 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:
-**
-** A pointer to the parser. This should be a pointer
-** obtained from phvolt_Alloc.
-** A pointer to a function used to reclaim memory obtained
-** from malloc.
-**
-*/
- 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":"= ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ?>"}},
+ "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":"= (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ?>"}},
+ "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":"= ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ?>"}},
+ "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= (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ?>"}},
+ "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= ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ?>"}},
+ "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= (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ?>"}},
+ "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":"= [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ?>"}},
+ "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":"= [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ?>"}},
+ "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":"= [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ?>"}},
+ "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":"= $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 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":"= $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 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":"= $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', [$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":"= $a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$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]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ?>"}},
+ "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":"= $a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$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]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ?>"}},
+ "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":"= $a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$a[$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]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ?>"}},
+ "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":"= -----------------------------------------------------------------------------------------------1 ?>"}},
+ "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":"= ------------------------------------------------------------------------------------------------1 ?>"}},
+ "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":"= -------------------------------------------------------------------------------------------------1 ?>"}},
+ "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":"= !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1 ?>"}},
+ "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":"= !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1 ?>"}},
+ "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":"= !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1 ?>"}},
+ "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":"= !$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 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":"= !$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 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":"= !$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, !$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":"= ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($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) ?>"}},
+ "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":"= ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($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) ?>"}},
+ "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":"= ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($a ? ($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) ?>"}},
+ "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":"= $a ?>}}"}},
+ "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":"= ['a' => 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":"= [1, 'a' => 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":"= [[1, 2], ['a' => [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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= isset($a) ?>"}},
+ "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":"= ($a) ?>"}},
+ "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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $a->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":"= $a->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":"= $this->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":"= $variable ?>"}},
+ "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":"= $a ?>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":"= $item ?>"}},
+ "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":"= 'hello' ?>"}},
+ "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":"= 'hello' ?>= 'hello' ?>"}},
+ "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":"= 'hello' ?>-= 'hello' ?>"}},
+ "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":"-= 'hello' ?>= 'hello' ?>-"}},
+ "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":"-= 'hello' ?>-= 'hello' ?>-"}},
+ "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 = = 100 + 50 ?>"}},
+ "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 = = 100 - 50 ?>"}},
+ "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 = = 100 * 50 ?>"}},
+ "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 = = 100 / 50 ?>"}},
+ "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 = = 100 % 50 ?>"}},
+ "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 = = 100 . 50 ?>"}},
+ "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":"= -10 ?>"}},
+ "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":"= !10 ?>"}},
+ "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":"= !$a ?>"}},
+ "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":"= !$a ?>"}},
+ "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":"= $a[0] ?>"}},
+ "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":"= $a[0][1] ?>"}},
+ "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":"= $a[0]['hello'] ?>"}},
+ "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":"= $a[0][1.2][false][true] ?>"}},
+ "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":"= range(1, 100) ?>"}},
+ "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":"= range('Z', 'A') ?>"}},
+ "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":"= range('a', 'z') ?>"}},
+ "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":"= range('a', 'z') ?>"}},
+ "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":"= $this->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":"= $this->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":"= $this->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":"= var_dump($a) ?>"}},
+ "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":"= date('Y-m-d', time()) ?>"}},
+ "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":"= $robots->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":"= \\Phalcon\\Tag::linkTo(['hello', 'some-link']) ?>"}},
+ "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":"= \\Phalcon\\Tag::formLegacy(['action' => '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":"= \\Phalcon\\Tag::stylesheetLink($config->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":"= \\Phalcon\\Tag::javascriptInclude('js/some.js') ?>"}},
+ "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":"= \\Phalcon\\Tag::image(['img/logo.png', 'width' => 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":"= \\Phalcon\\Tag::emailField(['email', 'class' => '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":"= $this->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":"= $this->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":"= trim('hello') ?>"}},
+ "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":"= strip_tags('hello') ?>"}},
+ "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":"= json_encode('hello') ?>"}},
+ "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":"= urlencode('hello') ?>"}},
+ "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":"= strtoupper('hello') ?>"}},
+ "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":"= strtolower('hello') ?>"}},
+ "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":"= $this->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":"= sprintf('My name is %s, %s', $name, 'thanks') ?>"}},
+ "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":"= $this->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":"= 'hello' ?>= $this->escaper->html('hello') ?>= 'hello' ?>= $this->escaper->html('hello') ?>= '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":"= 'hello' ?>"}},
+ "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":"= join(',', [1, 2]) ?>"}},
+ "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":"= join('\\'', [1, 2]) ?>"}},
+ "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":"= join('\\' . phpinfo() . \\'', ['x', 'y']) ?>"}},
+ "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":"= ((empty($readonly) ? (false) : ($readonly)) ? 'readonly=\"readonly\"' : '') ?>"}},
+ "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":"= 'Let\\'s Encrypt' ?>"}},
+ "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":"= 'say \\'hi\\'' ?>"}},
+ "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":"= $tag->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":"= $tag->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":"= $tag->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":"= $tag->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":"= $tag->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":"= $tag->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":"= $tag->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":"= $tag->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":"= ['x\\' => 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":"= ['x\\\\\\'' => 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":"= ['it\\'s' => 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":"= ['it\\'s' => 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":"= 'x\\\\\\'.injected();//' ?>"}},
+ "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":"= 'x\\\\\\'' ?>"}},
+ "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":"= 'it\\'s' ?>"}},
+ "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":"= '\\t' ?>"}},
+ "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":"= '\\\\t' ?>"}},
+ "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":"= 'x' ?>"}},
+ "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":"= $tag->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":"= $tag->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":"= $tag->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":"= $tag->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":"= $tag->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= $greatText ?>\n\n\n= (empty(false) ? ('simple text') : (false)) ?>\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= (empty($value) ? ('unknown') : ($value)) ?>"}},
+ "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":"= (empty($value) ? ('unknown') : ($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":"= $default ?>"}},
+ "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":"= $this->callMacro('add_extension', []) ?>a= 1 ?>b"}},
+ "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":"= $this->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":"= \\Phalcon\\Tag::linkTo(['abc']) ?>"}},
+ "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":"= \\Phalcon\\Tag::image(['abc']) ?>"}},
+ "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":"= \\Phalcon\\Tag::formLegacy(['abc']) ?>"}},
+ "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":"= \\Phalcon\\Tag::submitButton(['abc']) ?>"}},
+ "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":"= \\Phalcon\\Tag::radioField(['abc']) ?>"}},
+ "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":"= \\Phalcon\\Tag::checkField(['abc']) ?>"}},
+ "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":"= \\Phalcon\\Tag::fileField(['abc']) ?>"}},
+ "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":"= \\Phalcon\\Tag::hiddenField(['abc']) ?>"}},
+ "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":"= \\Phalcon\\Tag::passwordField(['abc']) ?>"}},
+ "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":"= \\Phalcon\\Tag::textArea(['abc']) ?>"}},
+ "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":"= \\Phalcon\\Tag::textField(['abc']) ?>"}},
+ "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":"= \\Phalcon\\Tag::emailField(['abc']) ?>"}},
+ "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":"= \\Phalcon\\Tag::dateField(['abc']) ?>"}},
+ "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":"= \\Phalcon\\Tag::telField(['abc']) ?>"}},
+ "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":"= \\Phalcon\\Tag::numericField(['abc']) ?>"}},
+ "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":"= \\Phalcon\\Tag::imageInput(['abc']) ?>"}},
+ "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":"= $this->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":"= $this->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":"= date('abc') ?>"}},
+ "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":"= time() ?>"}},
+ "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":"= var_dump('abc') ?>"}},
+ "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":"= (new Phalcon\\Support\\Version)->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":"= (new Phalcon\\Support\\Version)->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":"= constant('abc') ?>"}},
+ "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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= trim('abc') ?>"}},
+ "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":"= ltrim('abc') ?>"}},
+ "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":"= rtrim('abc') ?>"}},
+ "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":"= strip_tags('abc') ?>"}},
+ "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":"= urlencode('abc') ?>"}},
+ "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":"= addslashes('abc') ?>"}},
+ "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":"= stripslashes('abc') ?>"}},
+ "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":"= nl2br('abc') ?>"}},
+ "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":"= array_keys('abc') ?>"}},
+ "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":"= join(',', ['abc', 'def']) ?>"}},
+ "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":"= strtolower('abc') ?>"}},
+ "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":"= strtolower('abc') ?>"}},
+ "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":"= strtoupper('abc') ?>"}},
+ "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":"= strtoupper('abc') ?>"}},
+ "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":"= ucwords('abc') ?>"}},
+ "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":"= $this->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":"= json_encode('abc') ?>"}},
+ "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":"= json_decode('abc') ?>"}},
+ "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":"= sprintf('abc') ?>"}},
+ "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":"= abs('abc') ?>"}},
+ "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":"= $this->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":"= (empty('abc') ? ('def') : ('abc')) ?>"}},
+ "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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= 1 ?>"}},
+ "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":"= 1.2 ?>"}},
+ "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":"= false ?>"}},
+ "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":"= true ?>"}},
+ "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":"= null ?>"}},
+ "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":"= '\\'hello\\'' ?>"}},
+ "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":"= $a[0][1] ?>"}},
+ "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":"= $a[0]['hello'] ?>"}},
+ "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":"= $a[0][1.2][false][true] ?>"}},
+ "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":"= $a[0][1.2][false][true][$b] ?>"}},
+ "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":"= ($a->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":"= $a->($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":"= !!10 ?>"}},
+ "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":"= $this->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":"= $this->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":"= $this->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":"= $flash->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":"= $session->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":"= $user->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":"= $user->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":"= $a[0]('hello') ?>"}},
+ "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":"= array_keys([$a[0]('hello')->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":"= [1, 2, 3, 4] ?>"}},
+ "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":"= ['hello', 2, 1.3, false, true, null] ?>"}},
+ "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":"= ['hello', 2, 3, false, true, null, [1, 2, 'hola']] ?>"}},
+ "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":"= ['first' => 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":"= trim(($this->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":"= range('a', join(',', 'z')) ?>"}},
+ "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":"= sprintf('My real name is %s', $name) ?>"}},
+ "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":"= (empty($robot->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":"= $this->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":"= $test->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":"= $test->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":"= $this->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":"= $song ?> = $song ?>"}},
+ "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: = $song ?> = $song ?>"}},
+ "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)); ?>= $v174696563475456749841loop->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":"= $items[0] ?>"}},
+ "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":"= $map['key'] ?>"}},
+ "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":"= $items[$index] ?>"}},
+ "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":"= $user->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":"= $user->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":"= 1 + 2 ?>"}},
+ "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":"= 10 / 2 ?>"}},
+ "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":"= 10 % 3 ?>"}},
+ "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":"= 10 % 3 ?>"}},
+ "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":"= 4 * 3 ?>"}},
+ "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":"= pow(2, 8) ?>"}},
+ "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":"= 5 - 3 ?>"}},
+ "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":"= -$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":"= +$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":"= [1, 2, 3] ?>"}},
+ "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":"= ['a', 'b', 'c'] ?>"}},
+ "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":"= ['key' => '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":"= $html ?>"}},
+ "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":"= $this->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":"= $a == $b ?>"}},
+ "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":"= $a > $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":"= $a >= $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":"= $a === $b ?>"}},
+ "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":"= $a < $b ?>"}},
+ "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":"= $a <= $b ?>"}},
+ "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":"= $a != $b ?>"}},
+ "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":"= $a != $b ?>"}},
+ "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":"= $a !== $b ?>"}},
+ "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":"= 'Hello' . ' ' . 'World' ?>"}},
+ "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":"= $firstName . ' ' . $lastName ?>"}},
+ "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":"= 3.14 ?>"}},
+ "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":"= 42 ?>"}},
+ "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":"= 'Hello' ?>"}},
+ "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":"= 'say \\\"hi\\\"' ?>"}},
+ "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":"= 'Hello' ?>"}},
+ "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":"= $name ?>"}},
+ "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":"= $name ?>"}},
+ "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":"= $name ?>"}},
+ "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":"= $name ?>"}},
+ "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":"= strtoupper($name) ?>"}},
+ "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":"= trim(strtoupper($name)) ?>"}},
+ "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":"= $item ?>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) { ?>= $item->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) { ?>= $key ?>: = $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) { ?>= $key ?>"}},
+ "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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= (1 + 2) * 3 ?>"}},
+ "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":"= $this->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":"= !$this->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":"= isset($var) ?>"}},
+ "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":"= empty($var) ?>"}},
+ "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":"= (empty($title) ? $siteName : $title) ?>"}},
+ "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":"= ((($number) % 2) == 0) ?>"}},
+ "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":"= (is_array($var) || ($var) instanceof Traversable) ?>"}},
+ "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":"= !isset($var) ?>"}},
+ "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":"= !empty($var) ?>"}},
+ "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":"= !((($number) % 2) == 0) ?>"}},
+ "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":"= !(is_array($var) || ($var) instanceof Traversable) ?>"}},
+ "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":"= !is_numeric($var) ?>"}},
+ "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":"= !((($number) % 2) != 0) ?>"}},
+ "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":"= !is_scalar($var) ?>"}},
+ "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":"= is_numeric($var) ?>"}},
+ "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":"= ((($number) % 2) != 0) ?>"}},
+ "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":"= is_scalar($var) ?>"}},
+ "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":"= ($uploadedPhoto == $user->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":"= $a && $b ?>"}},
+ "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":"= $a || $b ?>"}},
+ "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) { ?>= $item ?>"}},
+ "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) { ?>= $item ?>"}},
+ "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; } } ?>= $visible ?>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; } } ?>= $times ?>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; } } ?>= $item ?>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 = $name ?>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; } } ?>= $visible ?>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=\"= $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 = $name ?>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":"= range(1, 10) ?>"}},
+ "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":"= range($start, $end) ?>"}},
+ "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":"= $this->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":"= $this->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":"= $this->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":"= (empty(false) ? ('simple text') : (false)) ?>"}},
+ "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":"= (empty($value) ? ('unknown') : ($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= $username ?>!\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":"= ($condition ? 'yes' : 'no') ?>"}},
+ "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":"= (isset($someVar) ? 'yes' : 'no') ?>"}},
+ "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":"= ($active ? $activeLabel : $inactiveLabel) ?>"}},
+ "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":"= $foo ?>"}},
+ "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 = 'b' ?> {{ 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\n= $this->partial('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 %}\nThis 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":"\nThis 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 %}\nThis 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":"\nThis 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: = $this->length($arr) ?>\nLength Object: = $this->length($obj) ?>\nLength String: = $this->length($str) ?>\nLength No String: = $this->length($no_str) ?>\nSlice Array: = join(',', $this->slice($arr, 0, null)) ?>\nSlice Array: = join(',', $this->slice($arr, 1, 2)) ?>\nSlice Array: = join(',', $this->slice($arr, 0, 2)) ?>\nSlice Object: = join(',', $this->slice($obj, 1, null)) ?>\nSlice Object: = join(',', $this->slice($obj, 1, 2)) ?>\nSlice Object: = join(',', $this->slice($obj, 0, 1)) ?>\nSlice String: = $this->slice('hello', 0, 2) ?>\nSlice String: = $this->slice('hello', 1, 2) ?>\nSlice String: = $this->slice('hello', 2, null) ?>\nSlice No String: = $this->slice(1234, 0, 2) ?>\nSlice No String: = $this->slice(1234, 1, 2) ?>\nSlice No String: = $this->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":"","parse":{"outcome":"value","value":[{"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":"","parse":{"outcome":"value","value":[{"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 = $song ?>!"}},
+ "cphalcon-views:compiler/parent.volt": {"source":"{% block head %} {% endblock %}{% block title %}{% endblock %} - My Webpage {% block content %}{% 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}]},"compile":{"outcome":"value","value":" - My Webpage
"}},
+ "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: = $some_var ?>"}},
+ "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":"= $parentObject->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":"= (empty($robot->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":"= json_encode((empty($preparedParams) ? ([]) : ($preparedParams))) ?>\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: = $this->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 = $tdate ?>, = $ttime ?> = $tz ?>macros['conditionaldate'] = \\Closure::bind($this->macros['conditionaldate'], $this); ?>= $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\"); } } ?>= $type ?> = $field ?> = $message ?>
macros['error_messages'] = \\Closure::bind($this->macros['error_messages'], $this); ?>= $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{%- 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":"","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) { ?>macros['formRow'] = \\Closure::bind($this->macros['formRow'], $this); ?>= $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); ?>= $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\"); } } ?>= var_dump($var) ?>macros['list'] = \\Closure::bind($this->macros['list'], $this); ?>= $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\"); } } ?>= 'Not Null: ' . $object->notNullValue . ' - Null: ' . $object->nullValue ?>macros['print'] = \\Closure::bind($this->macros['print'], $this); ?>= $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":3},{"type":304,"variable":"link","expr":{"type":265,"value":"related_links","file":"eval code","line":3},"block_statements":[{"type":357,"value":"","file":"eval code","line":4},{"type":359,"expr":{"type":46,"left":{"type":265,"value":"link","file":"eval code","line":4},"right":{"type":265,"value":"text","file":"eval code","line":4},"file":"eval code","line":4},"file":"eval code","line":5},{"type":357,"value":" ","file":"eval code","line":5}],"file":"eval code","line":7},{"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); ?>= $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":"= $date->getTimeStamp() ?>%= $this->callMacro('strtotime', ['now']) ?>%= $this->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= $username ?>!\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":"= ['key' => '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":"= $x ?>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":"= $x ?>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' => '',
+ 'cphalcon-views:compiler/import2.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 -%}
+
+
+{%- 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":"= $a + $b ?>"}},
+ "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":"= $a ?>\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":"= $a ?>\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= $a ?>"}},
+ "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":"= 'multi\nline' ?>\n= $b ?>"}},
+ "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":"= [1, 2] ?>"}},
+ "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":"= $this->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= $x ?>\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= $k ?>\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":"= $a ?>"}},
+ "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= $c ?>"}},
+ "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= $a ?>\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":"\n= $this->escaper->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":"= ($a ? $b : $c) ?>"}},
+ "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= $b ?>\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":"= 1 + 2 * 3 ?>"}},
+ "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":"= 1 * 2 + 3 ?>"}},
+ "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":"= 1 - 2 - 3 ?>"}},
+ "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":"= 1 / 2 / 3 ?>"}},
+ "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":"= 1 % 2 * 3 ?>"}},
+ "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":"= 1 * 2 % 3 ?>"}},
+ "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":"= $a . $b . $c ?>"}},
+ "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":"= $a . $b + $c ?>"}},
+ "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":"= $a + $b . $c ?>"}},
+ "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":"= $a + $b[0] ?>"}},
+ "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":"= $a * $b[0] ?>"}},
+ "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":"= $a->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":"= $a->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":"= $a->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":"= $a->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":"= $a->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":"= $a[0][1] ?>"}},
+ "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":"= $this->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":"= $this->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":"= !$a[0] ?>"}},
+ "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":"= !$a->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":"= !$this->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":"= !$a && $b ?>"}},
+ "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":"= !$a || $b ?>"}},
+ "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":"= !!$this->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":"= -$a->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":"= -$a * $b ?>"}},
+ "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":"= -$a + $b ?>"}},
+ "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":"= -$a[0] ?>"}},
+ "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":"= +$a - -$b ?>"}},
+ "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":"= -1 + 2 ?>"}},
+ "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":"= 'x' . strtoupper($a) ?>"}},
+ "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":"= !$this->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":"= $a + !$this->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":"= !$this->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":"= !$this->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":"= !$this->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":"= $this->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":"= $this->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":"= $this->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":"= (($a ? $b : $c) ? $d : $e) ?>"}},
+ "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":"= ($a ? ($b ? $c : $d) : $e) ?>"}},
+ "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":"= ($a ? range($b, $c) : $d) ?>"}},
+ "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":"= ($a ? $b : range($c, $d)) ?>"}},
+ "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":"= ($a ? $b && $c : $d) ?>"}},
+ "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":"= ($x + $a ? $b : $c) ?>"}},
+ "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":"= ($a ? $b : $c + $d) ?>"}},
+ "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":"= range($a, $b + $c) ?>"}},
+ "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":"= range(range($a, $b), $c) ?>"}},
+ "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":"= range($a, $b && $c) ?>"}},
+ "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":"= isset($a) && $b ?>"}},
+ "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":"= $a == $b + $c ?>"}},
+ "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":"= $a != $b + $c ?>"}},
+ "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":"= isset($x == $a) ?>"}},
+ "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":"= isset($a->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":"= empty($a[0]) ?>"}},
+ "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":"= ($a ? $b : isset($c)) ?>"}},
+ "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":"= $a . $b == $c ?>"}},
+ "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":"= $a == $b == $c ?>"}},
+ "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":"= $a < $b > $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":"= $a === $b !== $c ?>"}},
+ "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":"= $a >= $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":"= $a == $b && $c != $d ?>"}},
+ "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":"= $a || $b && $c ?>"}},
+ "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":"= $a && $b || $c ?>"}},
+ "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":"= pow(pow(2, 3), 2) ?>"}},
+ "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":"= pow(2 + 3, 4) ?>"}},
+ "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":"= pow(2, 3 + 4) ?>"}},
+ "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":"= $a % $b ?>"}},
+ "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":"= $a % $b * $c ?>"}},
+ "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":"= $a * $b % $c ?>"}},
+ "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":"= $a->-$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":"= $a->($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":"= $a->[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":"= $a->'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":"= $a->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":"= ($a + $b) * $c ?>"}},
+ "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":"= ($a)($b) ?>"}},
+ "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":"= [1, 2][0] ?>"}},
+ "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":"= ['a' => 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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $a[$b] ?>"}},
+ "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":"= $a[$b + 1] ?>"}},
+ "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":"= $a[1 + 2] ?>"}},
+ "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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= $this->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":"= [$a + $b, $c . $d] ?>"}},
+ "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":"= ['k' => ($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":"= $a ?>"}},
+ "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":"= $a != $b ?>"}},
+ "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":"= $a != $b ?>"}},
+ "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":"= $a != $b ?>"}},
+ "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":"= $a != $b ?>"}},
+ "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":"= $a == !$b ?>"}},
+ "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":"= $a == !$b ?>"}},
+ "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":"= $a != $hing ?>"}},
+ "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":"= $a != $_x ?>"}},
+ "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":"= !isset($a) ?>"}},
+ "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":"= $a == $b ?>"}},
+ "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":"= $a != $b ?>"}},
+ "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":"= $a != $b ?>"}},
+ "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":"= !isset($a) ?>"}},
+ "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":"= !empty($a) ?>"}},
+ "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":"= $a->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":"= $a->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":"= $a->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 ?>"}},
+ "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":"= (empty($a) ? ('x') : ($a)) ?>"}},
+ "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 ?>"}},
+ "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":"= (empty($a) ? (1) : ($a)) ?>"}},
+ "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":"= $cachex ?>"}},
+ "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($a, $b) ?>"}},
+ "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":"= pow($a, $b) ?>"}},
+ "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":"= $a % $b ?>"}},
+ "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":"= $a % $b ?>"}},
+ "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":"= $a - -$b ?>"}},
+ "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":"= 1.5 ?>"}},
+ "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":"= range(1, 2) ?>"}},
+ "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":"= range(1, 2) ?>"}},
+ "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":"= 007 ?>"}},
+ "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":"= 1.5->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":"= 99999999999999999999 ?>"}},
+ "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":"= $\\Foo\\Bar ?>"}},
+ "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":"= $this->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":"= $_a ?>"}},
+ "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":"= $a1 ?>"}},
+ "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":"= $iffy ?>"}},
+ "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":"= $endiff ?>"}},
+ "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":"= $nullable ?>"}},
+ "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":"= $trueish ?>"}},
+ "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":"= true ?>"}},
+ "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":"= null ?>"}},
+ "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":"= $a && $b ?>"}},
+ "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":"= $a || $b ?>"}},
+ "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":"= !$a ?>"}},
+ "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":"= isset($a) ?>"}},
+ "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":"= 'a\\\"b' ?>"}},
+ "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":"= 'a\\'b' ?>"}},
+ "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":"= 'a\nb' ?>"}},
+ "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":"= '\\n' ?>"}},
+ "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":"= 'a{{b' ?>"}},
+ "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":"= 'a\\\\' ?>"}},
+ "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":"= '$a' ?>"}},
+ "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":"= 'it\\'s' . 'say \"hi\"' ?>"}},
+ "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":"= $a ?>"}},
+ "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":"= $a . $b ?>"}},
+ "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":"= $a ?>"}},
+ "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":"= $a ?>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= $a ?>"}},
+ "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":"= $a ?>= $b ?>"}},
+ "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= $a ?>"}},
+ "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":"= $verbatimx ?>"}}
+ }
+}
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= $b ?> 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 = $b ?>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":"a= $b ?>c"}},
+ "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":"= $a ?>"}},
+ "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= $b ?>\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":"x= $a ?>= $b ?>y"}},
+ "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":"= $a ?>"}},
+ "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":"= $a ?>= $b ?>"}},
+ "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":"= $a ?>= $b ?>"}},
+ "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":"= $a ?>"}},
+ "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":"= $a ?>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":"= $a ?>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= $b ?>"}},
+ "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= 1 ?>"}},
+ "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":"= $a ?>"}},
+ "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, '')
+ && preg_match('/\{%-?\s*(?:end)?cache\b/i', $candidate) !== 1;
+}
+
+$corpus = [];
+$seen = [];
+
+foreach (array_slice($argv, 1) as $argument) {
+ [$label, $root] = array_pad(explode('=', $argument, 2), 2, '');
+
+ if ($label === '' || $root === '' || !file_exists($root)) {
+ fwrite(STDERR, "skipping invalid source '{$argument}'\n");
+
+ continue;
+ }
+
+ $root = rtrim($root, '/');
+ $added = 0;
+
+ foreach (harvestFiles($root) as $file) {
+ $relative = ltrim(substr($file, strlen($root)), '/');
+ $contents = file_get_contents($file);
+
+ if ($contents === false) {
+ continue;
+ }
+
+ $candidates = str_ends_with($file, '.volt') ? [$contents] : stringLiterals($contents);
+ $index = 0;
+
+ foreach ($candidates as $candidate) {
+ if (!isVoltSnippet($candidate) || isset($seen[$candidate])) {
+ continue;
+ }
+
+ $seen[$candidate] = true;
+ $index++;
+ $key = str_ends_with($file, '.volt')
+ ? "{$label}:{$relative}"
+ : "{$label}:" . preg_replace('/\.php$/', '', $relative) . "#{$index}";
+ $corpus[$key] = $candidate;
+ $added++;
+ }
+ }
+
+ echo " {$label}: {$added} snippet(s)\n";
+}
+
+$export = "
+ *
+ * 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;
}
}