From 5deae6f64e9a654c08098c1c9d3d6c11d85f3b82 Mon Sep 17 00:00:00 2001 From: Nigel-Ecma Date: Sat, 12 Jul 2025 15:50:48 +1200 Subject: [PATCH 1/4] Add support for Index & Range --- .../dependencies/GrammarTestingEnv.tgz | Bin 54839 -> 54631 bytes standard/README.md | 4 + standard/arrays.md | 4 +- standard/clauses.json | 3 +- standard/expressions.md | 203 +- standard/lexical-structure.md | 10 +- standard/ranges.md | 291 ++ standard/standard-library.md | 173 + .../part-I/Reference/sample.gruntree.red.txt | 2 +- .../part-I/Reference/sample.tree.red.txt | 2 +- .../part-I/Reference/sample.tree.svg | 3032 ++++++++--------- .../part-O/Reference/sample.gruntree.red.txt | 6 +- .../part-O/Reference/sample.tree.red.txt | 2 +- .../part-O/Reference/sample.tree.svg | 2672 +++++++-------- .../part-R/Reference/sample.gruntree.red.txt | 6 +- .../part-R/Reference/sample.tree.red.txt | 2 +- .../part-R/Reference/sample.tree.svg | 1782 +++++----- .../Reference/sample.gruntree.red.txt | 4 +- .../v6/RightShift/Reference/sample.stderr.txt | 2 +- .../RightShift/Reference/sample.tree.red.txt | 2 +- .../v6/RightShift/Reference/sample.tree.svg | 538 +-- .../Samples/v8/Element Access/ReadMe.md | 2 +- .../Samples/v8/Index & Range/ReadMe.md | 1 + .../Reference/sample.gruntree.red.txt | 1017 ++++++ .../Index & Range/Reference/sample.stderr.txt | 1 + .../Index & Range/Reference/sample.tokens.txt | 176 + .../Reference/sample.tree.red.txt | 1 + .../Index & Range/Reference/sample.tree.svg | 2285 +++++++++++++ .../v8/Index & Range/_Sample_Options.txt | 1 + .../Samples/v8/Index & Range/sample.cs | 26 + 30 files changed, 8181 insertions(+), 4069 deletions(-) create mode 100644 standard/ranges.md create mode 100644 tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/ReadMe.md create mode 100644 tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.gruntree.red.txt create mode 100644 tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.stderr.txt create mode 100644 tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.tokens.txt create mode 100644 tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.tree.red.txt create mode 100644 tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.tree.svg create mode 100644 tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/_Sample_Options.txt create mode 100644 tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/sample.cs diff --git a/.github/workflows/dependencies/GrammarTestingEnv.tgz b/.github/workflows/dependencies/GrammarTestingEnv.tgz index aa65ce27b2c9a58be2531a1fb716047d135bc398..932ae59a95bc1e4288f5f72d0eb1ded53819af97 100644 GIT binary patch literal 54631 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 E0Jis85C8xG literal 54839 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 | **Subclause** | **Category** | **Operators** | > | ----------------- | ------------------------------- | -------------------------------------------------------| > | [§12.8](expressions.md#128-primary-expressions) | Primary | `x.y` `x?.y` `f(x)` `a[x]` `a?[x]` `x++` `x--` `x!` `new` `typeof` `default` `checked` `unchecked` `delegate` `stackalloc` | -> | [§12.9](expressions.md#129-unary-operators) | Unary | `+` `-` `!x` `~` `++x` `--x` `(T)x` `await x` | +> | [§12.9](expressions.md#129-unary-operators) | Unary | `+` `-` `!x` `~` `^` `++x` `--x` `(T)x` `await x` | +> | §range-operator | Range | `..` | > | [§12.10](expressions.md#1210-arithmetic-operators) | Multiplicative | `*` `/` `%` | > | [§12.10](expressions.md#1210-arithmetic-operators) | Additive | `+` `-` | > | [§12.11](expressions.md#1211-shift-operators) | Shift | `<<` `>>` | @@ -167,10 +168,12 @@ The precedence of an operator is established by the definition of its associated When an operand occurs between two operators with the same precedence, the ***associativity*** of the operators controls the order in which the operations are performed: -- Except for the assignment operators and the null coalescing operator, all binary operators are ***left-associative***, meaning that operations are performed from left to right. +- Except for the assignment operators, the range operator, and the null coalescing operator, all binary operators are ***left-associative***, meaning that operations are performed from left to right. > *Example*: `x + y + z` is evaluated as `(x + y) + z`. *end example* - The assignment operators, the null coalescing operator and the conditional operator (`?:`) are ***right-associative***, meaning that operations are performed from right to left. > *Example*: `x = y = z` is evaluated as `x = (y = z)`. *end example* +- The range operator is ***non-associative***. + > *Example*: `x..y..z` is invalid. *end example* Precedence and associativity can be controlled using parentheses. @@ -182,21 +185,17 @@ All unary and binary operators have predefined implementations. In addition, use The ***overloadable unary operators*** are: -`+ - !` (logical negation only) `~ ++ -- true false` +> `+ - !` (logical negation only) `~ ++ -- true false` -> *Note*: Although `true` and `false` are not used explicitly in expressions (and therefore are not included in the precedence table in [§12.4.2](expressions.md#1242-operator-precedence-and-associativity)), they are considered operators because they are invoked in several expression contexts: Boolean expressions ([§12.24](expressions.md#1224-boolean-expressions)) and expressions involving the conditional ([§12.18](expressions.md#1218-conditional-operator)) and conditional logical operators ([§12.14](expressions.md#1214-conditional-logical-operators)). *end note* - +Only the operators listed above can be overloaded. In particular, it is not possible to overload the null-forgiving operator (postfix `!`, [§12.8.9](expressions.md#1289-null-forgiving-expressions)) or the unary hat operator (prefix `^`, (§hat-operator)). - -> *Note*: The null-forgiving operator (postfix `!`, [§12.8.9](expressions.md#1289-null-forgiving-expressions)) is not an overloadable operator. *end note* +> *Note*: Although `true` and `false` are not used explicitly in expressions (and therefore are not included in the precedence table in [§12.4.2](expressions.md#1242-operator-precedence-and-associativity)), they are considered operators because they are invoked in several expression contexts: Boolean expressions ([§12.24](expressions.md#1224-boolean-expressions)) and expressions involving the conditional ([§12.18](expressions.md#1218-conditional-operator)) and conditional logical operators ([§12.14](expressions.md#1214-conditional-logical-operators)). *end note* The ***overloadable binary operators*** are: -```csharp -+ - * / % & | ^ << >> == != > < <= >= -``` +> `+ - * / % & | ^ << >> == != > < <= >=` -Only the operators listed above can be overloaded. In particular, it is not possible to overload member access, method invocation, or the `=`, `&&`, `||`, `??`, `?:`, `=>`, `checked`, `unchecked`, `new`, `typeof`, `default`, `as`, and `is` operators. +Only the operators listed above can be overloaded. In particular, it is not possible to overload member access, method invocation, or the `..`, `=`, `&&`, `||`, `??`, `?:`, `=>`, `checked`, `unchecked`, `new`, `typeof`, `default`, `as`, and `is` operators. When a binary operator is overloaded, the corresponding compound assignment operator, if any, is also implicitly overloaded. @@ -348,8 +347,8 @@ In both of the above cases, a cast expression can be used to explicitly convert ***Lifted operators*** permit predefined and user-defined operators that operate on non-nullable value types to also be used with nullable forms of those types. Lifted operators are constructed from predefined and user-defined operators that meet certain requirements, as described in the following: -- For the unary operators `+`, `++`, `-`, `--`, `!`(logical negation), and `~`, a lifted form of an operator exists if the operand and result types are both non-nullable value types. The lifted form is constructed by adding a single `?` modifier to the operand and result types. The lifted operator produces a `null` value if the operand is `null`. Otherwise, the lifted operator unwraps the operand, applies the underlying operator, and wraps the result. -- For the binary operators `+`, `-`, `*`, `/`, `%`, `&`, `|`, `^`, `<<`, and `>>`, a lifted form of an operator exists if the operand and result types are all non-nullable value types. The lifted form is constructed by adding a single `?` modifier to each operand and result type. The lifted operator produces a `null` value if one or both operands are `null` (an exception being the `&` and `|` operators of the `bool?` type, as described in [§12.13.5](expressions.md#12135-nullable-boolean--and--operators)). Otherwise, the lifted operator unwraps the operands, applies the underlying operator, and wraps the result. +- For the unary operators `+`, `++`, `-`, `--`, `!` (logical negation), `^`, and `~`, a lifted form of an operator exists if the operand and result types are both non-nullable value types. The lifted form is constructed by adding a single `?` modifier to the operand and result types. The lifted operator produces a `null` value if the operand is `null`. Otherwise, the lifted operator unwraps the operand, applies the underlying operator, and wraps the result. +- For the binary operators `+`, `-`, `*`, `/`, `%`, `&`, `|`, `^`, `..`, `<<`, and `>>`, a lifted form of an operator exists if the operand and result types are all non-nullable value types. The lifted form is constructed by adding a single `?` modifier to each operand and result type. The lifted operator produces a `null` value if one or both operands are `null` (an exception being the `&` and `|` operators of the `bool?` type, as described in [§12.13.5](expressions.md#12135-nullable-boolean--and--operators)). Otherwise, the lifted operator unwraps the operands, applies the underlying operator, and wraps the result. - For the equality operators `==` and `!=`, a lifted form of an operator exists if the operand types are both non-nullable value types and if the result type is `bool`. The lifted form is constructed by adding a single `?` modifier to each operand type. The lifted operator considers two `null` values equal, and a `null` value unequal to any non-`null` value. If both operands are non-`null`, the lifted operator unwraps the operands and applies the underlying operator to produce the `bool` result. - For the relational operators `<`, `>`, `<=`, and `>=`, a lifted form of an operator exists if the operand types are both non-nullable value types and if the result type is `bool`. The lifted form is constructed by adding a single `?` modifier to each operand type. The lifted operator produces the value `false` if one or both operands are `null`. Otherwise, the lifted operator unwraps the operands and applies the underlying operator to produce the `bool` result. @@ -1657,7 +1656,7 @@ The *qualified_alias_member* production is defined in [§14.8](namespaces.md#148 A *member_access* is either of the form `E.I` or of the form `E.I`, where `E` is a *primary_expression*, *predefined_type* or *qualified_alias_member,* `I` is a single identifier, and `` is an optional *type_argument_list*. When no *type_argument_list* is specified, consider `e` to be zero. -A *member_access* with a *primary_expression* of type `dynamic` is dynamically bound ([§12.3.3](expressions.md#1233-dynamic-binding)). In this case, the compiler classifies the member access as a property access of type `dynamic`. The rules below to determine the meaning of the *member_access* are then applied at run-time, using the run-time type instead of the compile-time type of the *primary_expression*. If this run-time classification leads to a method group, then the member access shall be the *primary_expression* of an *invocation_expression*. +A *member_access* with a *primary_expression* of type `dynamic` is dynamically bound ([§12.3.3](expressions.md#1233-dynamic-binding)). In this case, the member access is classified as a property access of type `dynamic`. The rules below to determine the meaning of the *member_access* are then applied at run-time, using the run-time type instead of the compile-time type of the *primary_expression*. If this run-time classification leads to a method group, then the member access shall be the *primary_expression* of an *invocation_expression*. The *member_access* is evaluated and classified as follows: @@ -1952,7 +1951,7 @@ An *invocation_expression* is dynamically bound ([§12.3.3](expressions.md#1233- - The *primary_expression* has compile-time type `dynamic`. - At least one argument of the optional *argument_list* has compile-time type `dynamic`. -In this case, the compiler classifies the *invocation_expression* as a value of type `dynamic`. The rules below to determine the meaning of the *invocation_expression* are then applied at run-time, using the run-time type instead of the compile-time type of those of the *primary_expression* and arguments that have the compile-time type `dynamic`. If the *primary_expression* does not have compile-time type `dynamic`, then the method invocation undergoes a limited compile-time check as described in [§12.6.5](expressions.md#1265-compile-time-checking-of-dynamic-member-invocation). +In this case, the *invocation_expression* is classified as a value of type `dynamic`. The rules below to determine the meaning of the *invocation_expression* are then applied at run-time, using the run-time type instead of the compile-time type of those of the *primary_expression* and arguments that have the compile-time type `dynamic`. If the *primary_expression* does not have compile-time type `dynamic`, then the method invocation undergoes a limited compile-time check as described in [§12.6.5](expressions.md#1265-compile-time-checking-of-dynamic-member-invocation). The *primary_expression* of an *invocation_expression* shall be a method group or a value of a *delegate_type*. If the *primary_expression* is a method group, the *invocation_expression* is a method invocation ([§12.8.10.2](expressions.md#128102-method-invocations)). If the *primary_expression* is a value of a *delegate_type*, the *invocation_expression* is a delegate invocation ([§12.8.10.4](expressions.md#128104-delegate-invocations)). If the *primary_expression* is neither a method group nor a value of a *delegate_type*, a binding-time error occurs. @@ -2198,8 +2197,6 @@ element_access When recognising a *primary_expression* if both the *element_access* and *pointer_element_access* ([§23.6.4](unsafe-code.md#2364-pointer-element-access)) alternatives are applicable then the latter shall be chosen if the embedded *primary_expression* is of pointer type ([§23.3](unsafe-code.md#233-pointer-types)). -The *argument_list* of an *element_access* shall not contain `out` or `ref` arguments. - The *primary_expression* of an *element_access* shall not be an *array_creation_expression* unless it includes an *array_initializer*, or a *stackalloc_expression* unless it includes a *stackalloc_initializer*. > *Note*: This restriction exists to disallow potentially confusing code such as: @@ -2221,29 +2218,91 @@ The *primary_expression* of an *element_access* shall not be an *array_creation_ An *element_access* is dynamically bound ([§12.3.3](expressions.md#1233-dynamic-binding)) if at least one of the following holds: - The *primary_expression* has compile-time type `dynamic`. -- At least one expression of the *argument_list* has compile-time type `dynamic` and the *primary_expression* does not have an array type. +- At least one expression of the *argument_list* has compile-time type `dynamic`. -In this case, the compiler classifies the *element_access* as a value of type `dynamic`. The rules below to determine the meaning of the *element_access* are then applied at run-time, using the run-time type instead of the compile-time type of those of the *primary_expression* and *argument_list* expressions which have the compile-time type `dynamic`. If the *primary_expression* does not have compile-time type `dynamic`, then the element access undergoes a limited compile-time check as described in [§12.6.5](expressions.md#1265-compile-time-checking-of-dynamic-member-invocation). +In this case the compile-time type of the *element_access* depends on the compile-time type of its *primary_expression*: if it has an array type then the compile-time type is the element type of that array type; otherwise the compile-time type is `dynamic` and the *element_access* is classified as a value of type `dynamic`. The rules below to determine the meaning of the *element_access* are then applied at run-time, using the run-time type instead of the compile-time type of those of the *primary_expression* and *argument_list* expressions which have the compile-time type `dynamic`. If the *primary_expression* does not have compile-time type `dynamic`, then the element access undergoes a limited compile-time check as described in [§12.6.5](expressions.md#1265-compile-time-checking-of-dynamic-member-invocation). -If the *primary_expression* of an *element_access* is a value of an *array_type*, the *element_access* is an array access ([§12.8.12.2](expressions.md#128122-array-access)). Otherwise, the *primary_expression* shall be a variable or value of a class, struct, or interface type that has one or more indexer members, in which case the *element_access* is an indexer access ([§12.8.12.3](expressions.md#128123-indexer-access)). +> *Example*: +> +> ```csharp +> var index = (dynamic)1; // index has compile-time type dynamic +> int[] a = {0, 1, 2}; +> var a_elem = a[index]; // dynamically bound, a_elem has compile-time type int +> string s = "012"; +> var s_elem = s[index]; // dynamcially bound, s_elem has compile-time type dynamic +> ``` +> +> *end example* + +If the *primary_expression* of an *element_access* is: + +- a value of *array_type*, the *element_access* is an array access ([§12.8.12.2](expressions.md#128122-array-access)); +- a value of `string` type, the *element_access* is a string access (§string-access); +- otherwise, the *primary_expression* shall be a variable or value of a class, struct, or interface type that has one or more indexer members, in which case the *element_access* is an indexer access ([§12.8.12.3](expressions.md#128123-indexer-access)). #### 12.8.12.2 Array access -For an array access, the *primary_expression* of the *element_access* shall be a value of an *array_type*. Furthermore, the *argument_list* of an array access shall not contain named arguments. The number of expressions in the *argument_list* shall be the same as the rank of the *array_type*, and each expression shall be of type `int`, `uint`, `long`, or `ulong,` or shall be implicitly convertible to one or more of these types. +For an array access the *argument_list* shall not contain named arguments or by-reference arguments (§15.6.2.3). + +The number of expressions in the *argument_list* shall be the same as the rank of the *array_type*, and each expression shall be: + +- of type `int`, `uint`, `long`, or `ulong`; or +- for single rank array access only of compile-time type `Index` or `Range`; or +- shall be implicitly convertible to one or more of the above types. -The result of evaluating an array access is a variable of the element type of the array, namely the array element selected by the values of the expressions in the *argument_list*. +Indexing a single rank array using an expression of type `Index` or `Range` is *not* supported if the access is dynamically-bound (§12.8.12.1). -The run-time processing of an array access of the form `P[A]`, where `P` is a *primary_expression* of an *array_type* and `A` is an *argument_list*, consists of the following steps: +The run-time processing of an array access of the form `P[A]`, where `P` is a *primary_expression* of an *array_type* and `A` is an *argument_list* of index expressions, consists of the following steps: - `P` is evaluated. If this evaluation causes an exception, no further steps are executed. -- The index expressions of the *argument_list* are evaluated in order, from left to right. Following evaluation of each index expression, an implicit conversion ([§10.2](conversions.md#102-implicit-conversions)) to one of the following types is performed: `int`, `uint`, `long`, `ulong`. The first type in this list for which an implicit conversion exists is chosen. For instance, if the index expression is of type `short` then an implicit conversion to `int` is performed, since implicit conversions from `short` to `int` and from `short` to `long` are possible. If evaluation of an index expression or the subsequent implicit conversion causes an exception, then no further index expressions are evaluated and no further steps are executed. +- For each index expression in the *argument_list* in order, from left to right: + - The index expression is evaluated, let the type of the resultant value be *T*; + - This value is then converted to the first of the types: `int`, `uint`, `long`, `ulong`, or for static bound single rank array access only `Index` or `Range`; for which an implicit conversion ([§10.2](conversions.md#102-implicit-conversions)) from *T* exists. + - If evaluation of an index expression or the subsequent implicit conversion causes an exception, then no further index expressions are evaluated and no further steps are executed. - The value of `P` is checked to be valid. If the value of `P` is `null`, a `System.NullReferenceException` is thrown and no further steps are executed. -- The value of each expression in the *argument_list* is checked against the actual bounds of each dimension of the array instance referenced by `P`. If one or more values are out of range, a `System.IndexOutOfRangeException` is thrown and no further steps are executed. -- The location of the array element given by the index expressions is computed, and this location becomes the result of the array access. +- If the preceding steps have produced a single index value of type `Range` then: + - The result of evaluating the array access is a new array. + - The starting and ending indicies of the `Range` value are determined with respect to the length of the array referenced by `P`. + - If either index is out of range of the bounds of the array referenced by `P`, or the ending index comes before the starting index, then a `System.ArgumentOutOfRangeException` is thrown and no further steps are executed. + - A new array is created from a shallow copy of the elements of `P` from the starting to ending indicies, this is commonly referred to as a *slice*. This array becomes the results of the array access. + +> > *Note:* A range of elements of an array cannot be assigned to using an array access. This differs from indexer accesses (§12.8.12.3) which may, but need not, support assignment to a range of indicies specified by a `Range` value. *end note* + +- Otherwise: + - The result of evaluating the array access is a variable reference (§9.5) of the element type of the array. + - The value of each expression in the *argument_list* is checked against the actual bounds of each dimension of the array instance referenced by `P`. If one or more values are out of range, a `System.IndexOutOfRangeException` is thrown and no further steps are executed. + - The variable reference of the array element given by the index expressions is computed, and this becomes the result of the array access. + +#### §string-access String access + +For a string access the *argument_list* of an string access shall contain a single unnamed value argument (§15.6.2.2) which shall be of type: + +- of type `int`; or +- of compile-time type `Index` or `Range`; or +- shall be implicitly convertible to one or more of the above types. + +Indexing a string using an expression of type `Index` or `Range` is *not* supported if the access is dynamically-bound (§12.8.12.1). + +The run-time processing of a string access of the form `P[A]`, where `P` is a *primary_expression* of `string` type and `A` is a single expression, consists of the following steps: + +- `P` is evaluated. If this evaluation causes an exception, no further steps are executed. +- The index expression is evaluated, let the type of the resultant value be *T*; +- This value is then converted to the first of the types: `int`, or for static bound expressions only `Index` or `Range`; for which an implicit conversion ([§10.2](conversions.md#102-implicit-conversions)) from *T* exists. +- If evaluation of an index expression or the subsequent implicit conversion causes an exception, then no further index expressions are evaluated and no further steps are executed. +- The value of `P` is checked to be valid. If the value of `P` is `null`, a `System.NullReferenceException` is thrown and no further steps are executed. +- If the preceding steps have produced an index value of type `Range` then: + - The result of evaluating the string access is a value of `string` type. + - The starting and ending indicies of the `Range` value are determined with respect to the length of the string referenced by `P`. + - If either index is out of range of the bounds of the string referenced by `P`, or the ending index comes before the starting index, then a `System.ArgumentOutOfRangeException` is thrown and no further steps are executed. + - The result of the string access is a new string formed from a shallow copy of the characters of `P` from the starting to ending indicies, this is commonly referred to as a *substring*. +- Otherwise: + - The result of evaluating the string access is a value of `char` type. + - The value of the converted index expression is checked against the actual bounds of the string instance referenced by `P`. If the value is out of range, a `System.IndexOutOfRangeException` is thrown and no further steps are executed. + - The value of character at the offset of the converted index expression with the string `P` becomes the result of the string access. #### 12.8.12.3 Indexer access -For an indexer access, the *primary_expression* of the *element_access* shall be a variable or value of a class, struct, or interface type, and this type shall implement one or more indexers that are applicable with respect to the *argument_list* of the *element_access*. +For an indexer access, the *primary_expression* of the *element_access* shall be a variable or value of a class, struct, or interface type, and this type shall implement one or more indexers that are applicable with respect to the *argument_list* of the *element_access*. The *argument_list* cannot contain `out` or `ref` arguments. The binding-time processing of an indexer access of the form `P[A]`, where `P` is a *primary_expression* of a class, struct, or interface type `T`, and `A` is an *argument_list*, consists of the following steps: @@ -2254,9 +2313,19 @@ The binding-time processing of an indexer access of the form `P[A]`, where `P` i - If `I` is applicable with respect to `A` ([§12.6.4.2](expressions.md#12642-applicable-function-member)) and `S` is a class type other than `object`, all indexers declared in an interface are removed from the set. - If the resulting set of candidate indexers is empty, then no applicable indexers exist, and a binding-time error occurs. - The best indexer of the set of candidate indexers is identified using the overload resolution rules of [§12.6.4](expressions.md#1264-overload-resolution). If a single best indexer cannot be identified, the indexer access is ambiguous, and a binding-time error occurs. -- The index expressions of the *argument_list* are evaluated in order, from left to right. The result of processing the indexer access is an expression classified as an indexer access. The indexer access expression references the indexer determined in the step above, and has an associated instance expression of `P` and an associated argument list of `A`, and an associated type that is the type of the indexer. If `T` is a class type, the associated type is picked from the first declaration or override of the indexer found when starting with `T` and searching through its base classes. +- The accesors of the best indexer are checked: + - If the indexer access is the target of an assignment then the indexer must have a set or ref get accessor, if not a binding-time error occurs; + - Otherwise the indexer must have a get or ref get accesor, if not a binding-time arror occurs. + +The runtime processing of the indexer access consits of the following steps: -Depending on the context in which it is used, an indexer access causes invocation of either the get accessor or the set accessor of the indexer. If the indexer access is the target of an assignment, the set accessor is invoked to assign a new value ([§12.21.2](expressions.md#12212-simple-assignment)). In all other cases, the get accessor is invoked to obtain the current value ([§12.2.2](expressions.md#1222-values-of-expressions)). +- The target *primary_expression* `P` is evaluated. +- The index expressions of the *argument_list* `A` are evaluated in order, from left to right. +- Using the best indexer determined at binding-time: + - If the indexer access is the target of an assignment, the set accessor or ref get accessor is invoked to assign a new value ([§12.21.2](expressions.md#12212-simple-assignment)). + - In all other cases, the get accessor or ref get accesor is invoked to obtain the current value ([§12.2.2](expressions.md#1222-values-of-expressions)). + +The result of processing the indexer access is an expression classified as an indexer access. ### 12.8.13 Null Conditional Element Access @@ -2518,6 +2587,8 @@ An object initializer consists of a sequence of member initializers, enclosed by Each *initializer_target* is followed by an equals sign and either an expression, an object initializer or a collection initializer. It is not possible for expressions within the object initializer to refer to the newly created object it is initializing. +In the *argument_list* of an *initializer_target* there is no implicit support for arguments of type `Index` (§24.4.2) or `Range` (§24.4.3). + A member initializer that specifies an expression after the equals sign is processed in the same way as an assignment ([§12.21.2](expressions.md#12212-simple-assignment)) to the target. A member initializer that specifies an object initializer after the equals sign is a ***nested object initializer***, i.e., an initialization of an embedded object. Instead of assigning a new value to the field or property, the assignments in the nested object initializer are treated as assignments to members of the field or property. Nested object initializers cannot be applied to properties with a value type, or to read-only fields with a value type. @@ -3462,7 +3533,7 @@ An *anonymous_method_expression* is one of two ways of defining an anonymous fun ### 12.9.1 General -The `+`, `-`, `!` (logical negation [§12.9.4](expressions.md#1294-logical-negation-operator) only), `~`, `++`, `--`, cast, and `await` operators are called the unary operators. +The `+`, `-`, `!` (logical negation [§12.9.4](expressions.md#1294-logical-negation-operator) only), `~`, `^`, `++`, `--`, cast, and `await` operators are called the unary operators. > *Note*: The postfix null-forgiving operator ([§12.8.9](expressions.md#1289-null-forgiving-expressions)), `!`, due to its compile-time and non-overloadable only nature, is excluded from the above list. *end note* @@ -3473,6 +3544,7 @@ unary_expression | '-' unary_expression | logical_negation_operator unary_expression | '~' unary_expression + | '^' unary_expression | pre_increment_expression | pre_decrement_expression | cast_expression @@ -3484,7 +3556,12 @@ unary_expression *pointer_indirection_expression* ([§23.6.2](unsafe-code.md#2362-pointer-indirection)) and *addressof_expression* ([§23.6.5](unsafe-code.md#2365-the-address-of-operator)) are available only in unsafe code ([§23](unsafe-code.md#23-unsafe-code)). -If the operand of a *unary_expression* has the compile-time type `dynamic`, it is dynamically bound ([§12.3.3](expressions.md#1233-dynamic-binding)). In this case, the compile-time type of the *unary_expression* is `dynamic`, and the resolution described below will take place at run-time using the run-time type of the operand. +If the operand of a *unary_expression* has the compile-time type `dynamic`, it is dynamically bound ([§12.3.3](expressions.md#1233-dynamic-binding)). In this case: + +- the compile-time type of the *unary_expression* is: + - `Index` for the `^` hat operator (§hat-operator) + - `dynamic` for all other unary operators; and +- the resolution described below will take place at run-time using the run-time type of the operand. ### 12.9.2 Unary plus operator @@ -3575,6 +3652,26 @@ The result of evaluating `~x`, where `X` is an expression of an enumeration ty Lifted ([§12.4.8](expressions.md#1248-lifted-operators)) forms of the unlifted predefined bitwise complement operators defined above are also predefined. +### §hat-operator Hat/index from-end operator + +The unary `^` operator is called the *hat* (or *index from-end*) operator. The predefined hat operator is: + +```csharp +Index operator ^(int x); +``` + +The hat operator is not overloadable (§12.4.3). + +The result of an operation of the form `^x` is a from-end `Index` value (§24.2) equivalent to the result of the expression: + +```csharp +new Index(x, true) +``` + +As with the other *unary_expression*s the operand may have a compile-time type of `dynamic` (§12.9.1) and be dynamically bound (§12.3.3). The compile-time type of the result is always `Index`. + +A lifted ([§12.4.8](expressions.md#1248-lifted-operators)) form of the hat operator is also predefined. + ### 12.9.6 Prefix increment and decrement operators ```ANTLR @@ -3706,6 +3803,42 @@ At run-time, the expression `await t` is evaluated as follows: An awaiter’s implementation of the interface methods `INotifyCompletion.OnCompleted` and `ICriticalNotifyCompletion.UnsafeOnCompleted` should cause the delegate `r` to be invoked at most once. Otherwise, the behavior of the enclosing async function is undefined. +## §range-operator Range operator + +The `..` operator is called the *range* operator. + +```ANTLR +range_expression + : unary_expression + | unary_expression? '..' unary_expression? + ; +``` + +The predefined range operator is: + +```csharp +Range operator ..(Index x, Index y); +``` + +The range operator is not overloadable (§12.4.3). + +All range expressions are treated as having the form `x..y`, where: + +- `x` is the left operand if present, otherwise the expression `0`; and +- `y` is the right operand if present, otherwise the expression `^0`. + +The result of the operation is a `Range` value (§24.3) equivalent to the result of the expression: + +```csharp +new Range(x, y) +``` + +If either or both operands in a range expression have the compile-time type `dynamic`, then the expression is dynamically bound ([§12.3.3](expressions.md#1233-dynamic-binding)). The compile-time type of the result is always `Range`. + +A lifted ([§12.4.8](expressions.md#1248-lifted-operators)) form of the range operator is also predefined. + +The range operator is non-associative (§12.4.2). + ## 12.10 Arithmetic operators ### 12.10.1 General @@ -3714,10 +3847,10 @@ The `*`, `/`, `%`, `+`, and `-` operators are called the arithmetic operators. ```ANTLR multiplicative_expression - : unary_expression - | multiplicative_expression '*' unary_expression - | multiplicative_expression '/' unary_expression - | multiplicative_expression '%' unary_expression + : range_expression + | multiplicative_expression '*' range_expression + | multiplicative_expression '/' range_expression + | multiplicative_expression '%' range_expression ; additive_expression diff --git a/standard/lexical-structure.md b/standard/lexical-structure.md index 3e466b29c..f440da104 100644 --- a/standard/lexical-structure.md +++ b/standard/lexical-structure.md @@ -1010,11 +1010,11 @@ Punctuators are for grouping and separating. ```ANTLR operator_or_punctuator - : '{' | '}' | '[' | ']' | '(' | ')' | '.' | ',' | ':' | ';' - | '+' | '-' | ASTERISK | SLASH | '%' | '&' | '|' | '^' | '!' | '~' - | '=' | '<' | '>' | '?' | '??' | '::' | '++' | '--' | '&&' | '||' - | '->' | '==' | '!=' | '<=' | '>=' | '+=' | '-=' | '*=' | '/=' | '%=' - | '&=' | '|=' | '^=' | '<<' | '<<=' | '=>' | '??=' + : '{' | '}' | '[' | ']' | '(' | ')' | '.' | ',' | ':' | ';' + | '+' | '-' | '*' | '/' | '%' | '&' | '|' | '^' | '!' | '~' + | '=' | '<' | '>' | '?' | '??' | '::' | '++' | '--' | '&&' | '||' + | '->' | '==' | '!=' | '<=' | '>=' | '+=' | '-=' | '*=' | '/=' | '%=' + | '&=' | '|=' | '^=' | '<<' | '<<=' | '=>' | '??=' | '..' ; right_shift diff --git a/standard/ranges.md b/standard/ranges.md new file mode 100644 index 000000000..af9a61630 --- /dev/null +++ b/standard/ranges.md @@ -0,0 +1,291 @@ +# 24 Extended Indexing and Slicing + +> **Review Note:** This new chapter, currently (§24), is placed here temporarily to avoid text changes due to renumbering occurring in chapters & clauses otherwise unaffected by the PR. It’s final placement is not yet determined, however between the Arrays ([§17](arrays.md#17-arrays)) and Interfaces ([§18](interfaces.md#18-interfaces)) chapters might be suitable – other placements can be suggested during review. It can be relocated later with just a simple edit to `clauses.json`. + +## 24.1 General + +This chapter introduces a model for *extended indexable* and *sliceable* *collection* types built on: + +- The types introduced in this chapter, `System.Index` (§24.2) and `System.Range` (§24.3); +- The pre-defined unary `^` (§hat-operator) and binary `..` (§range-operator) operators; and +- The *element_access* expression. + +Under the model a type is classified as: + +- a *collection* if it represents a group of *element*s +- an *extended indexable* collection if it supports an *element_access* expression which has a single argument expression of type `Index` which returns and/or sets a single element of the type, either by value or by reference; and +- an *extended sliceable* if it supports an *element_access* expression which has a single argument expression of type `Range` which returns a *slice* of the elements of the type by value. + +> *Note*: The model does not require that a slice, unlike an element, of the type can be set, but a type may support it as an extension of the model. *end note* + +The model is supported for single-dimensional arrays (§12.8.12.2) and strings (§string-access). + +The model can be supported by any class, struct or interface type which provides appropriate indexers (§15.9) which implement the model semantics. + +Implicit support for the model is provided for types which do not directly support it but which provide a certain *pattern* of members (§24.4). This support is pattern-based, rather than semantic-based, as the semantics of the type members upon which it is based are *assumed* – the language does not enforce, or check, the semantics of these type members. + +### 24.1.1 Definitions + +For the purposes of this chapter the following terms are defined: + +- A ***collection*** is a type which represents a group of ***element***s +- A ***countable*** collection is one which provides a ***countable property*** an `int` valued instance property whose value is the number of elements currently in the group. This property must be named either `Length` or `Count`, the former is chosen if both exist. +- A ***sequence*** or ***indexable*** type is a collection: + - which is countable; + - where every element can be accessed using an *element_access* expression with a single required `int` argument, the ***from-start index***, additional optional arguments are allowed; + - a sequence is ***modifiable*** if every element can also be set using an *element_access* expression; + - an element’s from-start index is the number of elements before it in the sequence, for a sequence containing *N* elements: + - the first and last elements have indicies of 0 and *N*-1 respectively, and + - the ***past-end*** index, an index which represents a hypothetical element after the last one, has the value *N*; +- A ***from-end index*** represents an element’s position within a sequence relative to the last element. For a sequence containing *N* elements the first, last and past-end indicies are *N*, 1 and 0 respectively. +- A ***range*** is a contiguous run of zero or more indicies starting at any index within a sequence. +- A ***slice*** is the collection of elements within a range. +- A ***sliceable*** collection is one which: + - is countable; + - provides a method `Slice` which takes two `int` parameters specifying a range, being a starting index and a count of elements respectively, and returns a new slice constructed from the elements in the range. + +The above definitions are extended for uses of `Index` and `Range` as follows: + +- A type is also a *sequence* if an *element_access* expression taking a single required `Index` argument, rather than an `int` argument, is supported. Where a distinction is required the type is termed ***extended indexable***. +- A type is also *sliceable* if an *element_access* expression taking a single required `Range` argument, rather a `Slice` method, is supported. Where a distinction is required the type is termed ***extended sliceable***. + +Whether a type is classified as countable, indexable, or sliceable is subject to the constraints of member accessibility (§7.5) and therefore dependent on where the type is being used. + +> *Example*: A type where the countable property and/or the indexer are `protected` is only a sequence to members of itself and any derived types. *end example* + +The required members for a type to qualify as a sequence or sliceable may be inherited. + +> *Example*: In the following code +> +> ```CSharp +> public class A +> { +> public int Length { get { … } } +> } +> +> public class B : A +> { +> public int this(int index) { … } +> } +> +> public class C : B +> { +> public int[] Slice(int index, int count) { … } +> } +> ``` +> +> The type `A` is countable, `B` is a sequence, and `C` is sliceable and a sequence. +> +> *end example* + +*Note*: + +- A type can be sliceable without being indexable due to the lack of an (accessible) indexer. +- For a type to be sliceable and/or indexable requires the type to be countable. +- While the elements of a sequence are ordered by *position* within the sequence the elements themselves need not be ordered by their value, or even orderable. + +*end note* + +## 24.2 The `Index` type + +The `System.Index` type represents an *abstract* index which is either a *from-start index* or a *from-end index*. + +```CSharp + public readonly struct Index : IEquatable + { + public int Value { get; } + public bool IsFromEnd { get; } + + public Index(int value, bool fromEnd = false); + + public static implicit operator Index(int value); + public int GetOffset(int length); + public bool Equals(Index other); + } +``` + +`Index` values are constructed from an `int`, specifying the positive offset, and a `bool`, indicating whether the offset is from the end (`true`) or start (`false`). If the specified offset is negative an `ArgumentOutOfRangeException` is thrown. + +> *Example* +> +> ```CSharp +> Index first = new Index(0, false); // first element index +> var last = new Index(1, true); // last element index +> var past = new Index(0, true); // past-end index +> +> Index invalid = new Index(-1); // throws ArgumentOutOfRangeException +> ``` +> +> *end example* + +There is an implicit conversion from `int` to `Index` which produces from-start indicies, and a language-defined unary operator `^` (§hat-operator) from `int` to `Index` which produces from-end indicies. + +> *Example* +> +> Using implicit conversions and the unary `^` operator the above examples may be written: +> +> ```CSharp +> Index first = 0; // first element index +> var last = ^1; // last element index +> var past = ^0; // past-end index +> ``` +> +> *end example* + +The method `GetOffset` converts from an abstract `Index` value to a concrete `int` index value for a sequence of the specified `length`. + +If the `Index` value, `I`, is from-end this method returns the same value as `length - I.Value`, otherwise it returns the same value as `I.Value`. + +This method does **not** check that the return value is in the valid range of `0` through `length-1` inclusive. + +> *Note:* No checking is specified as the expected use of the result is to index into a sequence with `length` elements, and that indexing operation is expected to perform the appropriate checks. *end note* + +`Index` implements `IEquatable` and values may be compared for equality. However `Index` values are not ordered and no other comparison operations are provided. + +> *Note:* `Index` values are unordered as they are abstract indicies, it is in general impossible to determine whether a from-end index comes before or after a from start index without reference to a sequence length. Once converted to concrete indicies, e.g. by `GetOffset`, those concrete indicies are comparable. *end note* + +`Index` values may be directly used in the *argument_list* of an *element_access* expression (§12.8.12): + +- which is statically bound (§12.3.2) and: + - it is an array access and the target is a single-dimensional array (§12.8.12.2); + - it is a string access (§string-access); or + - it is an indexer access and the target type conforms to a sequence pattern for which implicit `Index` support is specified (§24.4.2). +- which is statically or dynamically bound (§12.3.2) and: + - it is an indexer access and the target type has an indexer with parameters of `Index` type (§12.8.12.3); + +## 24.3 The `Range` type + +The `System.Range` type represents the abstract range of `Index`es from a `Start` index up to, but not including, an `End` index. + +```CSharp + public readonly struct Range : IEquatable + { + public Index Start { get; } + public Index End { get; } + + public Range(Index start, Index end); + + public (int Offset, int Length) GetOffsetAndLength(int length); + public bool Equals(Range other); + } +``` + +`Range` values are constructed from two `Index` values. + +> *Example* +> +> The following examples use the implicit conversion from `int` to `Index` (introduced above) and the `^` (§hat-operator) operator to create the `Index` values for each `Range`: +> +> ```CSharp +> var firstQuad = new Range(0, 4); // the indicies from `0` to `3` +> // int values impicitly convert to `Index` +> var nextQuad = new Range(4, 8); // the indicies from `4` to `7` +> var wholeSeq = new Range(0, ^0); // the indicies from `0` to `N-1` where `N` is the +> // length of the sequence wholeSeq is used with +> var dropFirst = new Range(1, ^0); // the indicies from `1` to `N-1` +> var dropLast = new Range(0, ^1); // the indicies from `0` to `N-2` +> ``` +> +> *end example* + +The language-defined operator `..` (§range-operator) creates a `Range` value from `Index` values. + +> *Example* +> +> Using the `..` the above examples may be written: +> +> ```CSharp +> var firstQuad = 0..4; // the indicies from `0` to `3` +> var nextQuad = 4..8; // the indicies from `4` to `7` +> var wholeSeq = 0..^0; // the indicies from `0` to `N-1` +> var dropFirst = 1..^0; // the indicies from `1` to `N-1` +> var dropLast = 0..^1; // the indicies from `0` to `N-2` +> ``` +> +> *end example* + +The operands of `..` are optional, the first defaults to `0`, the second defaults to `^0`. + +> *Example* +> +> Four of the above examples can also be written: +> +> ```CSharp +> var firstQuad = ..4; // the indicies from `0` to `3` +> var wholeSeq = ..; // the indicies from `0` to `N-1` +> var dropFirst = 1..; // the indicies from `1` to `N-1` +> var dropLast = ..^1; // the indicies from `0` to `N-2` +> ``` +> +> *end example* + +The method `GetOffsetAndLength` converts an abstract `Range` value to a tuple value consisting of a concrete `int` index and a number of elements, applicable to a sequence with `length` elements. If the `Range` value is invalid with respect to sequence with `length` elements this method throws `ArgumentOutOfRangeException`. + +> *Example* +> +> Using the variables defined above with `GetOffSetAndLength(6)`: +> +> ```CSharp +> var (ix0, len0) = firstQuad.GetOffsetAndLength(6); // ix0 = 0, len0 = 4 +> var (ix1, len1) = nextQuad.GetOffsetAndLength(6); // throws ArgumentOutOfRangeException +> // as range crosses sequence end +> var (ix2, len2) = wholeSeq.GetOffsetAndLength(6); // ix2 = 0, len2 = 6 +> var (ix3, len3) = dropFirst.GetOffsetAndLength(6); // ix3 = 1, len3 = 5 +> var (ix4, len4) = dropLast.GetOffsetAndLength(6); // ix4 = 0, len4 = 5 +> ``` + +`Range` implements `IEquatable` and values may be compared for equality. However `Range` values are not ordered and no other comparison operations are provided. + +> *Note:* `Range` values are unordered both as they are abstract and there is no unique ordering relation. Once converted to a concrete start and length, e.g. by `GetOffsetAndLength`, and ordering relation could be defined. *end note* + +`Range` values can be directly used in the *argument_list* of an *element_access* expression (§12.8.12): + +- which is statically bound (§12.3.2) and: + - it is an array access and the target is a single-dimensional array (§12.8.12.2); + - it is a string access (§string-access); or + - it is an indexer access (§12.8.12.3) and the target type conforms to a sequence pattern for which implicit `Range` support is specified (§24.4.3). +- which is statically or dynamically bound (§12.3.2) and: + - it is an indexer access and the target type has an indexer with parameters of `Range` type (§12.8.12.3). + +## 24.4 Pattern-based implicit support for `Index` and `Range` + +### 24.4.1 General + +If a statically bound (§12.3.2, §12.8.12.1) *element_access* expression (§12.8.12) of the form `E[A]`; where `E` has type `T` and `A` is a single expression implicitly convertible at compile-time to `Index` or `Range`; fails to be identified as: + +- an array access (§12.8.12.2), +- a string access (§string-access), or +- or and indexer access (§12.8.12.3) as `T` provides no suitable accessible indexer + +then pattern-based implicit support for the expression is provided if `T` conforms to a pattern. If `T` does not conform to the pattern then a compile-time error occurs. + +### 24.4.2 Implicit `Index` Support + +If in any context a statically bound (§12.3.2, §12.8.12.1) *element_access* expression (§12.8.12) of the form `E[A]`; where `E` has type `T` and `A` is a single expression implicitly convertible to `Index`; is not valid (§24.4.1) then if in the same context: + +- `T` provides accessible members qualifying it as a *sequence* (§24.1.1); and +- the expression `E[0]` is valid + +then the expression `E[A]` shall be implicitly supported. + +Without otherwise constraining implementations of this Standard the order of evaluation of the expression shall be equivalent to: + +1. `E` is evaluated; +2. `A` is evaluated; +3. the countable property of `T` is evaluated, if required by the implementation; +4. the get or set accessor of the `int` based indexer of `T` that would be used by `E[0]` in the same context is invoked. + +### 24.4.3 Implicit `Range` Support + +If in any context a statically bound (§12.3.2, §12.8.12.1) *element_access* expression (§12.8.12) of the form `E[A]`; where `E` has type `T` and `A` is a single expression implicitly convertible to `Range`; is not valid (§24.4.1) then if in the same context: + +- `T` provides accessible members qualifying it as both *countable* and *sliceable* (§24.1.1) + +then the expression `E[A]` shall be implicitly supported. + +Without otherwise constraining implementations of this Standard the order of evaluation of the expression shall be equivalent to: + +1. `E` is evaluated; +2. `A` is evaluated; +3. the countable property of `T` is evaluated, if required by the implementation; +4. the `Slice` method of `T` is invoked. diff --git a/standard/standard-library.md b/standard/standard-library.md index 9e8efdac0..a3b1aced6 100644 --- a/standard/standard-library.md +++ b/standard/standard-library.md @@ -36,6 +36,12 @@ namespace System public ArgumentException(string? message, Exception? innerException); } + public class ArgumentOutOfRangeException : ArgumentException + { + public ArgumentOutOfRangeException(string? paramName); + public ArgumentOutOfRangeException(string? paramName, string? message); + } + public class ArithmeticException : Exception { public ArithmeticException(); @@ -130,6 +136,11 @@ namespace System void Dispose(); } + public interface IEquatable + { + bool Equals(T? other); + } + public interface IFormattable { } public sealed class IndexOutOfRangeException : Exception @@ -396,6 +407,164 @@ namespace System public OperationCanceledException(string? message, Exception? innerException); } + /// + /// A read-only value type which represents an abstract + /// index to be used with collections. + /// - The Index can be relative to the start or end of a + /// collection. + /// - An Index can be converted to a zero-based concrete + /// from-start index to be used with a collection + /// of some specified length. + /// - Equality between Index values is provided, however + /// unlike concrete indicies they are not ordered. + /// - Array and String element access support indexing + /// with Index values. + /// + public readonly struct Index : IEquatable + { + /// + /// Construct an Index from an integer value and a + /// boolean indicating whether the value is relative + /// to the end (true) or start (false). + /// + /// + /// The value, must be ≥ 0. + /// + /// + /// Optional boolean indicating whether the Index is + /// relative to the end (true) or start (false). + /// The default value is false. + /// + /// + /// Thrown if value < 0. + /// + /// + /// If the Index is relative to the start then: + /// - the value 0 refers to the first element. + /// If the Index is relative to the end then: + /// - the value 1 refers to the last element; and + /// - the value 0 refers to beyond last element. + /// + public Index(int value, bool fromEnd = false); + + /// + /// Implicit conversion from integer to a + /// from-start Index. + /// + /// + /// The predefined operator: + /// Index operator ^(int value); + /// is provided to convert from integer to a + /// from-end Index. + /// + public static implicit operator Index(int value); + + /// + /// Return the value. + /// + public int Value { get; } + + /// + /// Return whether the Index is relative to + /// the end (true) or start (false). + /// + public bool IsFromEnd { get; } + + /// + /// Return a concrete from-start index for a + /// given collection length. + /// + /// + /// The length of the collection that the index + /// will be used with. + /// + /// + /// This method performs no sanity checking and + /// will never throw an IndexOutOfRangeException. + /// It is expected that the returned index will be + /// used with a collection which will do validation. + /// + public int GetOffset(int length); + + /// + /// Indicates whether the current Index value is + /// equal to another Index value. + /// + /// + /// The value to compare with this Index. + /// + public bool Equals(Index other); + } + + /// + /// A read-only value type which represents a range of + /// abstract indicies to be used with collections. + /// - The Range has two Index properties, Start and End. + /// - A Range can be converted to a concrete index from + /// the start and a length value to be used with a + /// collection of some specified length. + /// - Equality between Range values is provided, + /// however they are not ordered. + /// - Array and String element access supports indexing + /// with Range values, returning a sub-array/substring + /// of the indexed value respectively. + /// + public readonly struct Range : IEquatable + { + /// + /// Construct a Range from two Index values. + /// + /// + /// The inclusive Index value for the start + /// of the range. + /// + /// + /// The exclusive Index value for the end + /// of the range. + /// + /// As Index values represent unordered abstract + /// indicies no sanity checking can be performed + /// on the resultant Range value, + /// ". + /// + /// The predefined operator: + /// Range operator ..(Index start, Index end); + /// also exists to create a Range value. + /// + public Range(Index start, Index end); + + /// Return the starting Index. + public Index Start { get; } + + /// Return the ending Index. + public Index End { get; } + + /// + /// Return a concrete from-start index and the + /// range length for a given collection length. + /// + /// + /// The length of the collection that the result + /// will be used with. + /// + /// + /// Thrown if the range is not valid wrt length. + /// + /// + /// A tuple consisting of an index value and range length + /// + public (int Offset, int Length) GetOffsetAndLength(int length); + + /// + /// Indicates whether the current Range value is equal + /// to another Range value. + /// + /// + /// The value to compare with this Range. + /// + public bool Equals(Range other); + } + public readonly ref struct ReadOnlySpan { public int Length { get; } @@ -1105,6 +1274,7 @@ The following library types are referenced in this specification. The full names - `global::System.Action` - `global::System.ArgumentException` +- `global::System.ArgumentOutOfRangeException` - `global::System.ArithmeticException` - `global::System.Array` - `global::System.ArrayTypeMisMatchException` @@ -1124,7 +1294,9 @@ The following library types are referenced in this specification. The full names - `global::System.GC` - `global::System.IAsyncDisposable` - `global::System.IDisposable` +- `global::System.IEquatable` - `global::System.IFormattable` +- `global::System.Index` - `global::System.IndexOutOfRangeException` - `global::System.Int16` - `global::System.Int32` @@ -1140,6 +1312,7 @@ The following library types are referenced in this specification. The full names - `global::System.OperationCanceledException` - `global::System.OutOfMemoryException` - `global::System.OverflowException` +- `global::System.Range` - `global::System.ReadOnlySpan` - `global::System.SByte` - `global::System.Single` diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-I/Reference/sample.gruntree.red.txt b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-I/Reference/sample.gruntree.red.txt index 2b6bc6914..1f0eb4e20 100644 --- a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-I/Reference/sample.gruntree.red.txt +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-I/Reference/sample.gruntree.red.txt @@ -598,7 +598,7 @@ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ * ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ -⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ number diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-I/Reference/sample.tree.red.txt b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-I/Reference/sample.tree.red.txt index b2451249c..0faf8849b 100644 --- a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-I/Reference/sample.tree.red.txt +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-I/Reference/sample.tree.red.txt @@ -1 +1 @@ -(prog (compilation_unit (namespace_declaration namespace (qualified_identifier (identifier My)) (namespace_body { (namespace_member_declaration (enum_declaration (attributes (attribute_section [ (attribute_target_specifier (attribute_target (identifier type)) :) (attribute_list (identifier Flags)) ])) (enum_modifier public) enum (identifier E) (enum_body { (enum_member_declarations (enum_member_declaration (identifier A)) , (enum_member_declaration (identifier B) = (constant_expression (identifier A))) , (enum_member_declaration (identifier C) = (constant_expression (additive_expression (additive_expression (literal 2)) + (multiplicative_expression (identifier A))))) , (enum_member_declaration (identifier D))) , }))) (namespace_member_declaration (delegate_declaration (delegate_modifier public) delegate (return_type void) (delegate_header (identifier Delegate) ( (parameter_list (fixed_parameter (type (class_type object)) (identifier P))) ) ;))) (namespace_member_declaration (namespace_declaration namespace (qualified_identifier (identifier Test)) (namespace_body { (using_directive (using_namespace_directive using (namespace_name (identifier System)) ;)) (using_directive (using_namespace_directive using (namespace_name (namespace_or_type_name (identifier System) . (identifier Collections))) ;)) (namespace_member_declaration (class_declaration (class_modifier public) class (identifier Список) (class_body { (class_member_declaration (method_declaration (method_modifiers (method_modifier (ref_method_modifier public)) (method_modifier (ref_method_modifier static))) (return_type (identifier IEnumerable)) (method_header (member_name (identifier Power)) ( (parameter_list (fixed_parameters (fixed_parameter (type (integral_type int)) (identifier number)) , (fixed_parameter (type (integral_type int)) (identifier exponent)))) )) (method_body (block { (statement_list (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (identifier Список)) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier Список) = (local_variable_initializer (object_creation_expression new (type (identifier Список)) ( ))))))) ;)) (statement (expression_statement (statement_expression (invocation_expression (primary_expression (member_access (primary_expression (identifier Список)) . (identifier Main))) ( ))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (integral_type int)) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier counter) = (local_variable_initializer (parenthesized_expression ( (expression (additive_expression (additive_expression (literal 0)) + (multiplicative_expression (literal 0)))) ))))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (integral_type int)) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier אתר) = (local_variable_initializer (literal 0)))))) ;)) (statement (while_statement while ( (boolean_expression (relational_expression (relational_expression (pre_increment_expression ++ (unary_expression (post_increment_expression (primary_expression (identifier counter)) ++)))) < (shift_expression (pre_decrement_expression -- (unary_expression (post_decrement_expression (primary_expression (identifier exponent)) --)))))) ) (embedded_statement (block { (statement_list (statement (expression_statement (statement_expression (assignment (unary_expression (identifier result)) (assignment_operator =) (expression (additive_expression (additive_expression (additive_expression (multiplicative_expression (multiplicative_expression (identifier result)) * (unary_expression (identifier number)))) + (multiplicative_expression (unary_expression + (unary_expression (post_increment_expression (primary_expression (post_increment_expression (primary_expression (identifier number)) ++)) ++))))) + (multiplicative_expression (identifier number)))))) ;)) (statement (yield_statement yield return (expression (identifier result)) ;))) }))))) })))) (class_member_declaration (method_declaration (method_modifiers (ref_method_modifier static)) (return_type void) (method_header (member_name (identifier Main)) ( )) (method_body (block { (statement_list (foreach_statement foreach ( (local_variable_type (integral_type int)) (identifier i) in (expression (invocation_expression (primary_expression (identifier Power)) ( (argument_list (argument (literal 2)) , (argument (literal 8))) ))) ) (embedded_statement (block { (statement_list (expression_statement (statement_expression (invocation_expression (primary_expression (member_access (primary_expression (identifier Console)) . (identifier Write))) ( (argument_list (argument (literal "{0} ")) , (argument (identifier i))) ))) ;)) })))) })))) (class_member_declaration (method_declaration (method_modifiers (method_modifier async)) (return_type void) (method_header (member_name (identifier Wait)) ( )) (method_body (block { (statement_list (expression_statement (statement_expression (await_expression await (unary_expression (invocation_expression (primary_expression (member_access (primary_expression (member_access (primary_expression (member_access (primary_expression (member_access (primary_expression (identifier System)) . (identifier Threading))) . (identifier Tasks))) . (identifier Task))) . (identifier Delay))) ( (argument_list (literal 0)) ))))) ;)) })))) (class_member_declaration (method_declaration method_modifiers (return_type void) (method_header (member_name (identifier AsyncAnonymous)) ( )) (method_body (block { (statement_list (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier task) = (expression (invocation_expression (primary_expression (member_access (primary_expression (member_access (primary_expression (identifier Task)) . (identifier Factory))) . (identifier StartNew))) ( (argument_list (lambda_expression async (anonymous_function_signature (explicit_anonymous_function_signature ( ))) => (anonymous_function_body (block { (statement_list (return_statement return (expression (await_expression await (unary_expression (invocation_expression (primary_expression (member_access (primary_expression (object_creation_expression new (type (identifier WebClient)) ( ))) . (identifier DownloadStringTaskAsync))) ( (argument_list (literal "http://example.com")) ))))) ;)) })))) )))))) ;)) })))) }))) }))) })))) +(prog (compilation_unit (namespace_declaration namespace (qualified_identifier (identifier My)) (namespace_body { (namespace_member_declaration (enum_declaration (attributes (attribute_section [ (attribute_target_specifier (attribute_target (identifier type)) :) (attribute_list (identifier Flags)) ])) (enum_modifier public) enum (identifier E) (enum_body { (enum_member_declarations (enum_member_declaration (identifier A)) , (enum_member_declaration (identifier B) = (constant_expression (identifier A))) , (enum_member_declaration (identifier C) = (constant_expression (additive_expression (additive_expression (literal 2)) + (multiplicative_expression (identifier A))))) , (enum_member_declaration (identifier D))) , }))) (namespace_member_declaration (delegate_declaration (delegate_modifier public) delegate (return_type void) (delegate_header (identifier Delegate) ( (parameter_list (fixed_parameter (type (class_type object)) (identifier P))) ) ;))) (namespace_member_declaration (namespace_declaration namespace (qualified_identifier (identifier Test)) (namespace_body { (using_directive (using_namespace_directive using (namespace_name (identifier System)) ;)) (using_directive (using_namespace_directive using (namespace_name (namespace_or_type_name (identifier System) . (identifier Collections))) ;)) (namespace_member_declaration (class_declaration (class_modifier public) class (identifier Список) (class_body { (class_member_declaration (method_declaration (method_modifiers (method_modifier (ref_method_modifier public)) (method_modifier (ref_method_modifier static))) (return_type (identifier IEnumerable)) (method_header (member_name (identifier Power)) ( (parameter_list (fixed_parameters (fixed_parameter (type (integral_type int)) (identifier number)) , (fixed_parameter (type (integral_type int)) (identifier exponent)))) )) (method_body (block { (statement_list (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (identifier Список)) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier Список) = (local_variable_initializer (object_creation_expression new (type (identifier Список)) ( ))))))) ;)) (statement (expression_statement (statement_expression (invocation_expression (primary_expression (member_access (primary_expression (identifier Список)) . (identifier Main))) ( ))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (integral_type int)) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier counter) = (local_variable_initializer (parenthesized_expression ( (expression (additive_expression (additive_expression (literal 0)) + (multiplicative_expression (literal 0)))) ))))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (integral_type int)) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier אתר) = (local_variable_initializer (literal 0)))))) ;)) (statement (while_statement while ( (boolean_expression (relational_expression (relational_expression (pre_increment_expression ++ (unary_expression (post_increment_expression (primary_expression (identifier counter)) ++)))) < (shift_expression (pre_decrement_expression -- (unary_expression (post_decrement_expression (primary_expression (identifier exponent)) --)))))) ) (embedded_statement (block { (statement_list (statement (expression_statement (statement_expression (assignment (unary_expression (identifier result)) (assignment_operator =) (expression (additive_expression (additive_expression (additive_expression (multiplicative_expression (multiplicative_expression (identifier result)) * (range_expression (identifier number)))) + (multiplicative_expression (unary_expression + (unary_expression (post_increment_expression (primary_expression (post_increment_expression (primary_expression (identifier number)) ++)) ++))))) + (multiplicative_expression (identifier number)))))) ;)) (statement (yield_statement yield return (expression (identifier result)) ;))) }))))) })))) (class_member_declaration (method_declaration (method_modifiers (ref_method_modifier static)) (return_type void) (method_header (member_name (identifier Main)) ( )) (method_body (block { (statement_list (foreach_statement foreach ( (local_variable_type (integral_type int)) (identifier i) in (expression (invocation_expression (primary_expression (identifier Power)) ( (argument_list (argument (literal 2)) , (argument (literal 8))) ))) ) (embedded_statement (block { (statement_list (expression_statement (statement_expression (invocation_expression (primary_expression (member_access (primary_expression (identifier Console)) . (identifier Write))) ( (argument_list (argument (literal "{0} ")) , (argument (identifier i))) ))) ;)) })))) })))) (class_member_declaration (method_declaration (method_modifiers (method_modifier async)) (return_type void) (method_header (member_name (identifier Wait)) ( )) (method_body (block { (statement_list (expression_statement (statement_expression (await_expression await (unary_expression (invocation_expression (primary_expression (member_access (primary_expression (member_access (primary_expression (member_access (primary_expression (member_access (primary_expression (identifier System)) . (identifier Threading))) . (identifier Tasks))) . (identifier Task))) . (identifier Delay))) ( (argument_list (literal 0)) ))))) ;)) })))) (class_member_declaration (method_declaration method_modifiers (return_type void) (method_header (member_name (identifier AsyncAnonymous)) ( )) (method_body (block { (statement_list (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier task) = (expression (invocation_expression (primary_expression (member_access (primary_expression (member_access (primary_expression (identifier Task)) . (identifier Factory))) . (identifier StartNew))) ( (argument_list (lambda_expression async (anonymous_function_signature (explicit_anonymous_function_signature ( ))) => (anonymous_function_body (block { (statement_list (return_statement return (expression (await_expression await (unary_expression (invocation_expression (primary_expression (member_access (primary_expression (object_creation_expression new (type (identifier WebClient)) ( ))) . (identifier DownloadStringTaskAsync))) ( (argument_list (literal "http://example.com")) ))))) ;)) })))) )))))) ;)) })))) }))) }))) })))) diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-I/Reference/sample.tree.svg b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-I/Reference/sample.tree.svg index 994d268a4..bc4e09f5e 100644 --- a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-I/Reference/sample.tree.svg +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-I/Reference/sample.tree.svg @@ -515,2076 +515,2076 @@ - - -block - - - -delegate_header - - - -explicitly_typed_local_variable_declaration - - - -+ - - - -primary_expression + + +int - - -0 + + +. - - -expression + + +) - - -primary_expression + + +} - - -ref_method_modifier + + +) - - -Factory + + +explicitly_typed_local_variable_declarator - - -{ + + +argument_list - - -Main + + +System - - + + ; - - -Список - - - -delegate_declaration + + +identifier - - -additive_expression + + +Test - - + + declaration_statement - - -identifier + + +void - - -prog + + +object_creation_expression - - -statement_list + + +System - - -identifier + + +method_declaration - - -{ + + +public - - -statement + + ++ - - -async + + +* - - -await + + +primary_expression - - -; + + +primary_expression - - -A + + +member_access - - -identifier + + +local_variable_initializer - - -identifier + + +argument_list - - -, + + +statement_expression - - + + identifier - - -type - - - -attribute_list - - - -+ + + +statement - - -unary_expression + + +literal - - -identifier + + +argument_list - - + + type - - -) - - - + + identifier - - -namespace_name + + +enum_modifier - - -local_variable_declaration + + +constant_expression - - + + method_body - - -class_type - - - -identifier - - - -return_type - - - -invocation_expression - - - -} + + +method_modifiers - - -method_declaration + + +; P - - -method_header - - - -attribute_target_specifier + + +explicitly_typed_local_variable_declarators - - -Wait + + +unary_expression - - -primary_expression + + +. - - -; + + +class_member_declaration - - -expression + + +block - - -literal + + +public - - -; + + +member_access - - -Collections + + +identifier - - -literal + + +local_variable_declaration - - -explicitly_typed_local_variable_declarators + + +type - - -return_type + + +identifier - - -delegate + + +invocation_expression + + + +assignment + + + +member_name + + + +identifier + + + +argument + + + +identifier + + + +C + + + +, + + + +. + + + +ref_method_modifier + + + +class_type + + + +Список + + + +identifier parameter_list - - -expression_statement + + +explicitly_typed_local_variable_declarators - - -System + + +method_body - - -) + + +attribute_target - - + + +fixed_parameter + + + +literal + + + +await_expression + + + +class_member_declaration + + + block - - -identifier + + +0 - - -identifier + + +multiplicative_expression - - -class_modifier + + +public - - -method_modifiers + + +in - - -) + + +A - - -. + + +Tasks - - -< + + +statement - - -pre_increment_expression + + +local_variable_initializer - - -) + + +namespace_member_declaration - - -boolean_expression + + +argument - - -block + + +fixed_parameters - - + + +=> + + + +static + + + +statement_list + + + +identifier + + + primary_expression - - -type + + +int - - -foreach_statement + + +; - - -method_declaration + + +argument - - -method_declaration + + +delegate_modifier - - -return_statement + + +method_modifiers - - -invocation_expression + + +block - - -invocation_expression + + +namespace_declaration - - -} + + +statement_expression - - -using_directive + + +identifier - - -primary_expression + + +local_variable_initializer - - -namespace_body + + +identifier + + + +declaration_statement + + + +++ + + + +multiplicative_expression + + + +await + + + +( + + + +statement_list + + + +expression + + + +, method_modifier - - -Main + + +attribute_section - - -class_member_declaration + + +qualified_identifier - - -( + + +++ - - -identifier + + +) - - -identifier + + +namespace_body - - -additive_expression + + +pre_increment_expression - - -block + + +. - - -parenthesized_expression + + +Delegate - - -) + + +delegate - - -method_header + + +identifier + + + +qualified_identifier { - - -literal - - - -embedded_statement - - - -local_variable_declaration + + +Console - - + + identifier - - -statement + + +method_body - - -primary_expression + + +Task - - -. + + +int - - -public + + +class_declaration - - -primary_expression + + +expression_statement - - -primary_expression + + += - - -local_variable_type + + +class_member_declaration - - -namespace + + +identifier - - -} + + +additive_expression - - -method_modifier + + +( - - -identifier + + +expression_statement - - -embedded_statement + + +( - - + + +attribute_target_specifier + + + ref_method_modifier - - -unary_expression + + +using_namespace_directive - - -enum_member_declaration + + +result - - -) + + +argument_list - - -static + + +member_name - - + + type - - -post_increment_expression - - - -; + + +additive_expression - - -pre_decrement_expression + + +identifier - - -type + + +embedded_statement - - -+ + + +expression_statement - - -0 + + +invocation_expression - - -method_modifiers + + +method_modifier - - -namespace_or_type_name + + +A - - -, + + +} - - -identifier + + +boolean_expression - - -number + + +result - - -statement_list + + +int - - + + identifier - - -statement - - - -) + + +0 - - -member_access + + +{ - - -+ + + +"{0}·" - - -explicitly_typed_local_variable_declarator + + +additive_expression - - -multiplicative_expression + + +number - - -method_body + + +} - - -fixed_parameter + + +E - - -Delay + + +explicitly_typed_local_variable_declarators - - -identifier + + +{ - - -implicitly_typed_local_variable_declarator + + +explicitly_typed_local_variable_declaration - - -enum_member_declarations + + +, - - -assignment + + +return_type - - + + primary_expression - - + + identifier - - -namespace_body - - - -block - - - -method_header - - - -using_directive - - - + + enum_member_declaration - - -void + + +method_modifier - - -local_variable_initializer + + +shift_expression - - -D + + +expression_statement - - + + identifier - - -) - - - -int + + +exponent - - -statement_expression + + +identifier - - -type + + +2 - - + + ( - - -System + + +primary_expression - - -namespace_declaration + + +identifier - - + + integral_type - - -declaration_statement + + +identifier - - -primary_expression + + +8 - - -local_variable_declaration + + +pre_decrement_expression - - -explicitly_typed_local_variable_declarators + + +2 - - -argument + + +anonymous_function_body - - + + +, + + + ( - - -argument + + +statement_list - - -using_namespace_directive + + +yield_statement - - -integral_type + + +expression - - -exponent + + +"http://example.com" - - -unary_expression + + +statement_list - - -result + + +additive_expression - - -primary_expression + + +counter - - -( + + +relational_expression - - -IEnumerable + + +) - - -Console + + +0 - - -} + + +{ - - -identifier + + +explicit_anonymous_function_signature - - -number + + +identifier - - -A + + +( - - -} + + +identifier - - -) + + +await - - -; + + +type - - -foreach + + +declaration_statement - - -explicitly_typed_local_variable_declaration + + +type - - -{ + + +++ - - -identifier + + +number - - -expression_statement + + +using_directive - - + + primary_expression - - -A + + +unary_expression - - -) + + +method_declaration - - + + identifier - - -expression_statement + + +return_type + + + +member_name + + + +, + + + +; + + + +( - - -class + + +member_name - - -new + + +; - - -( + + +literal - - -result + + +void - - + + identifier - - -( + + +; - - + + +argument_list + + + identifier - - -literal + + +invocation_expression { - - -integral_type - - - -int + + +{ - - -namespace_member_declaration + + +. - - -i + + +invocation_expression - - -expression + + +multiplicative_expression - - -) + + +Main - - -literal + + +anonymous_function_signature - - + + identifier - - -compilation_unit + + +( - - -= + + +await_expression - - -statement + + +( - - -integral_type + + += - - -unary_expression + + +expression - - -[ + + +method_header - - -counter + + +statement_expression - - -2 + + +compilation_unit - - -. + + +namespace_member_declaration - - -enum_modifier + + +primary_expression - - -) + + +namespace_name - - -0 + + +identifier - - -StartNew + + +range_expression - - -( + + +using - - -enum_declaration + + +) - - -explicitly_typed_local_variable_declarators + + +while_statement - - -literal + + +DownloadStringTaskAsync - - -multiplicative_expression + + += - - -class_member_declaration + + +block - - -} + + +System - - -method_body + + +) - - --- + + +) - - -method_declaration + + +( - - + + = - - -, - - - -member_access - - - -. - - - -argument_list - - - -post_increment_expression + + +return_statement - - -async + + +literal - - -class_member_declaration + + +embedded_statement - - + + return_type - - -identifier + + +method_declaration - - -Tasks + + +primary_expression - - -Task + + +IEnumerable - - -Threading + + +local_variable_declaration - - -enum + + +additive_expression - - -explicitly_typed_local_variable_declaration + + +{ - - -enum_member_declaration + + +namespace - - -) + + +literal - - + + identifier - - -{ - - - -invocation_expression - - - -statement_list + + +local_variable_declaration - - -statement_expression + + +int - - -local_variable_initializer + + +primary_expression - - -exponent + + +A - - -public + + +-- - - -member_access + + +attributes - - -multiplicative_expression + + +namespace_or_type_name - - -qualified_identifier + + +result - - -invocation_expression + + +explicitly_typed_local_variable_declaration - - -fixed_parameters + + +primary_expression - - -var + + +statement - - -literal + + +parenthesized_expression - - -void + + +i - - -await_expression + + +{ - - -statement_list + + +fixed_parameter - - -} + + +new B - - -, - - - -local_variable_declaration - - - -. - - - -statement_list - - - -qualified_identifier + + +Delay - - -int + + +; - - -declaration_statement + + +member_access - - --- + + +primary_expression - - -class_body + + +statement - - -identifier + + +. - - -expression + + +( - - -E + + +member_access - - -identifier + + +new - - -namespace_member_declaration + + +literal - - -identifier + + ++ + + + +multiplicative_expression post_increment_expression - - -Power + + +identifier - - -task + + +local_variable_type - - -identifier + + +using - - -{ + + +implicitly_typed_local_variable_declaration - - -= + + +parameter_list - - -result + + +enum - - -2 + + +explicitly_typed_local_variable_declaration - - -( + + +method_header - - -expression_statement + + +var - - -void + + +async - - -) + + +namespace_body - - -member_access + + +; - - -( + + +object_creation_expression - - -anonymous_function_body + + +identifier - - -fixed_parameter + + +enum_member_declaration - - -multiplicative_expression + + +-- - - -( + + +) - - + + +} + + + identifier - - -void + + +( - - -explicitly_typed_local_variable_declarator + + +statement_list - - -additive_expression + + +( - - -identifier + + +Список - - -anonymous_function_signature + + +class_body - - -method_modifier + + +Список - - -object + + +unary_expression - - -] + + +number - - -statement + + +constant_expression - - + + +integral_type + + + +primary_expression + + + ( - - -number + + +primary_expression - - -argument + + +. - - -literal + + +lambda_expression - - -unary_expression + + +return - - -delegate_modifier + + +member_access - - -identifier + + +integral_type - - -explicitly_typed_local_variable_declarator + + +type - - + + identifier - - -attributes - - - -declaration_statement + + +identifier type - - -{ - - - -method_body - - - -{ - - - -argument_list - - - -identifier + + +namespace_member_declaration - - -; + + +integral_type - - -constant_expression + + +namespace_declaration - - -argument + + +Power - - -i + + +implicitly_typed_local_variable_declarator - - -enum_member_declaration + + +foreach - - -= + + +StartNew - - -argument_list + + +D - - -; + + +Power - - -identifier + + +Main - - -await_expression + + +literal - - -class_member_declaration + + +; - - -Delegate + + +statement - - + + identifier - - -C - - - -My + + +multiplicative_expression - - -object_creation_expression + + +async - - + + identifier - - -static + + +statement_list - - -, + + +identifier - - -0 + + +using_directive - - -expression + + +} - - -literal + + +Write - - -statement_expression + + +method_declaration - - -attribute_section + + +fixed_parameter - - -"{0}·" + + +Список - - -) + + +explicitly_typed_local_variable_declarator - - -primary_expression + + +post_increment_expression - - -using + + +type - - + + member_access - - -Список + + +method_modifiers - - + + identifier - - -. + + +enum_member_declarations - - -enum_body + + +: - - -Список + + +. ( - - + + +identifier + + + ++ - - -( + + +identifier - - -member_access + + +block - - -primary_expression + + +Threading אתר - - -int - - - -shift_expression + + +{ - - -++ + + +void - - -. + + +identifier - - -( + + +invocation_expression - - -await + + +static - - -statement + + +primary_expression - - -= + + +Flags - - -: + + +unary_expression - - -using_namespace_directive + + +; - - + + identifier - - -=> - - - + + ) - - -} - - - -fixed_parameter - - - -in + + +) - - -primary_expression + + +prog - - -namespace_member_declaration + + +; - - -relational_expression + + +) - - -++ + + +block - - -number + + +declaration_statement - - -object_creation_expression + + +exponent - - -"http://example.com" + + +literal - - -implicitly_typed_local_variable_declaration + + +unary_expression - - -member_access + + +, - - -while_statement + + +block - - + + identifier - - -return + + +enum_declaration - - -++ + + +primary_expression - - -identifier + + +{ counter - - -method_modifiers - - - -member_name + + +0 - - -namespace_name + + +< - - -yield + + +member_access - - -attribute_target + + +identifier - - -* + + +WebClient - - -int + + +argument - - -= + + +; - - -{ + + +foreach_statement - - -post_decrement_expression + + +statement - - -invocation_expression + + +AsyncAnonymous - - -; + + +. - - -, + + +member_access - - + + identifier - - -argument_list - - - -statement_expression - - - -( - - - -namespace_member_declaration + + ++ - - -new + + ++ - - + + identifier - - -Write + + +expression - - -} + + += + + + +Список - - -unary_expression + + +return - - -unary_expression + + +yield - - -Power + + +[ - - -return_type + + +enum_member_declaration - - -Task + + +return_type - - -; + + +using_namespace_directive - - -ref_method_modifier + + +post_decrement_expression - - -method_header + + +) - - -member_name + + +integral_type - - -, + + +delegate_declaration - - -Test + + +] while - - -integral_type + + +} - - -local_variable_initializer + + +) - - -public + + +attribute_list - - -unary_expression + + +primary_expression - - -identifier + + +method_header - - -additive_expression + + +namespace_name - - -AsyncAnonymous + + +Wait - - -statement_list + + +public - - -primary_expression + + +. - - -return + + +delegate_header - - -class_declaration + + +identifier - - -member_access + + +Factory - - + + identifier - - -block - - - -method_modifiers + + +identifier - - -yield_statement + + +} } - - -multiplicative_expression - - - -identifier - - - -( - - - -Список - - - -relational_expression + + +primary_expression - - -DownloadStringTaskAsync + + +) - - -; + + +) - - -WebClient + + +void - - -System + + +enum_body - - -parameter_list + + +unary_expression - - + + primary_expression - - -return_type - - - -+ - - - -statement + + +identifier - - -member_name + + +member_access - - -constant_expression + + +number - - -identifier + + +class_modifier - - -. + + +post_increment_expression - - -explicit_anonymous_function_signature + + +My - - -namespace_declaration + + +Task - - -assignment_operator + + +unary_expression - - -type + + +i - - -argument_list + + +class - - -; + + +invocation_expression - - -identifier + + +object - - -block + + +class_member_declaration additive_expression - - + + +return_type + + + +expression + + + identifier - - -{ + + += - - -; + + +) - - -public + + +relational_expression - - -type + + +multiplicative_expression - - -member_name + + +primary_expression - - -using + + +literal - - -Flags + + +, - - -identifier + + +ref_method_modifier - - -8 + + +} - - + + +expression + + + +additive_expression + + + +; + + + +method_header + + + identifier - - -expression + + +type - - -= + + +explicitly_typed_local_variable_declarator - - + + identifier - - -multiplicative_expression + + +} - - + + ) - - -Список + + +local_variable_declaration - - -member_access + + +method_modifiers - - -additive_expression + + +statement - - -primary_expression + + += - - -additive_expression + + +} - - -lambda_expression + + +identifier + + + +enum_member_declaration + + + +{ + + + ++ + + + +task namespace - - -} - - - -. + + +statement_expression - - + + identifier - - -. + + +statement_list - - -primary_expression + + +method_body - - + + ( - - -statement_list + + +namespace_member_declaration + + + +( + + + +assignment_operator + + + +Collections \ No newline at end of file diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-O/Reference/sample.gruntree.red.txt b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-O/Reference/sample.gruntree.red.txt index 318651ca2..0478900c7 100644 --- a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-O/Reference/sample.gruntree.red.txt +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-O/Reference/sample.gruntree.red.txt @@ -845,7 +845,7 @@ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ * ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ -⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ i @@ -854,7 +854,7 @@ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ / ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ -⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ i @@ -863,7 +863,7 @@ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ % ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ -⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ i diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-O/Reference/sample.tree.red.txt b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-O/Reference/sample.tree.red.txt index 0b336426c..4dcda1537 100644 --- a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-O/Reference/sample.tree.red.txt +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-O/Reference/sample.tree.red.txt @@ -1 +1 @@ -(prog (compilation_unit (namespace_declaration namespace (qualified_identifier (identifier Comments) . (identifier XmlComments) . (identifier UndocumentedKeywords)) (namespace_body { (namespace_member_declaration (class_declaration class (identifier (contextual_keyword yield)) (class_body { (class_member_declaration (method_declaration method_modifiers (return_type void) (method_header (member_name (identifier Params)) ( (parameter_list (fixed_parameters (fixed_parameter (parameter_modifier (parameter_mode_modifier ref)) (type (contextual_keyword dynamic)) (identifier a)) , (fixed_parameter (parameter_modifier (parameter_mode_modifier out)) (type (contextual_keyword dynamic)) (identifier b))) , (parameter_array params (array_type (non_array_type (contextual_keyword dynamic)) (rank_specifier [ ])) (identifier c))) )) (method_body (block { })))) (class_member_declaration (method_declaration method_modifiers (return_type void) (method_header (member_name (identifier Params)) ( (parameter_list (fixed_parameters (fixed_parameter (parameter_modifier (parameter_mode_modifier out)) (type (contextual_keyword dynamic)) (identifier a) (default_argument = (expression (literal 2)))) , (fixed_parameter (parameter_modifier (parameter_mode_modifier ref)) (type (contextual_keyword dynamic)) (identifier c) (default_argument = (expression (explictly_typed_default default ( (type (contextual_keyword dynamic)) )))))) , (parameter_array params (array_type (non_array_type (contextual_keyword dynamic)) (rank_specifier [ ]) (rank_specifier [ ])) (identifier c))) )) (method_body (block { })))) (class_member_declaration (method_declaration (method_modifiers (method_modifier (ref_method_modifier public)) (method_modifier (ref_method_modifier override))) (return_type (class_type string)) (method_header (member_name (identifier ToString)) ( )) (method_body (block { (statement_list (return_statement return (expression (invocation_expression (primary_expression (base_access base . (identifier ToString))) ( ))) ;)) })))) (class_member_declaration (method_declaration (method_modifiers (method_modifier (ref_method_modifier public)) partial) (return_type void) (method_header (member_name (identifier OnError)) ( )) (method_body ;))) (class_member_declaration (method_declaration (method_modifiers (method_modifier (ref_method_modifier public)) partial) (return_type void) (method_header (member_name (identifier method)) ( )) (method_body (block { (statement_list (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (array_type (non_array_type (nullable_value_type (non_nullable_value_type (integral_type int)) (nullable_type_annotation ?))) (rank_specifier [ ]))) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier a) = (local_variable_initializer (array_creation_expression new (non_array_type (nullable_value_type (non_nullable_value_type (integral_type int)) (nullable_type_annotation ?))) [ (expression_list (literal 5)) ])))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (array_type (non_array_type (integral_type int)) (rank_specifier [ ]))) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier (contextual_keyword var)) = (local_variable_initializer (array_initializer { (variable_initializer_list (variable_initializer (literal 1)) , (variable_initializer (literal 2)) , (variable_initializer (literal 3)) , (variable_initializer (literal 4)) , (variable_initializer (literal 5))) })))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (integral_type int)) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier i) = (local_variable_initializer (element_access (primary_expression (identifier a)) [ (argument_list (identifier i)) ])))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (namespace_or_type_name (identifier Foo) (type_argument_list < (type_argument (identifier T)) >))) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier f) = (local_variable_initializer (object_creation_expression new (type (namespace_or_type_name (identifier Foo) (type_argument_list < (type_argument (integral_type int)) >))) ( ))))))) ;)) (statement (expression_statement (statement_expression (invocation_expression (primary_expression (member_access (primary_expression (identifier f)) . (identifier method))) ( ))) ;)) (statement (expression_statement (statement_expression (assignment (unary_expression (identifier i)) (assignment_operator =) (expression (inclusive_or_expression (inclusive_or_expression (and_expression (and_expression (additive_expression (additive_expression (additive_expression (identifier i)) + (multiplicative_expression (identifier i))) - (multiplicative_expression (multiplicative_expression (multiplicative_expression (multiplicative_expression (identifier i)) * (unary_expression (identifier i))) / (unary_expression (identifier i))) % (unary_expression (identifier i))))) & (equality_expression (identifier i)))) | (exclusive_or_expression (exclusive_or_expression (identifier i)) ^ (and_expression (identifier i))))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (simple_type bool)) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier b) = (local_variable_initializer (inclusive_or_expression (inclusive_or_expression (and_expression (and_expression (boolean_literal true)) & (equality_expression (boolean_literal false)))) | (exclusive_or_expression (exclusive_or_expression (boolean_literal true)) ^ (and_expression (boolean_literal false))))))))) ;))) })))) }))) })))) +(prog (compilation_unit (namespace_declaration namespace (qualified_identifier (identifier Comments) . (identifier XmlComments) . (identifier UndocumentedKeywords)) (namespace_body { (namespace_member_declaration (class_declaration class (identifier (contextual_keyword yield)) (class_body { (class_member_declaration (method_declaration method_modifiers (return_type void) (method_header (member_name (identifier Params)) ( (parameter_list (fixed_parameters (fixed_parameter (parameter_modifier (parameter_mode_modifier ref)) (type (contextual_keyword dynamic)) (identifier a)) , (fixed_parameter (parameter_modifier (parameter_mode_modifier out)) (type (contextual_keyword dynamic)) (identifier b))) , (parameter_array params (array_type (non_array_type (contextual_keyword dynamic)) (rank_specifier [ ])) (identifier c))) )) (method_body (block { })))) (class_member_declaration (method_declaration method_modifiers (return_type void) (method_header (member_name (identifier Params)) ( (parameter_list (fixed_parameters (fixed_parameter (parameter_modifier (parameter_mode_modifier out)) (type (contextual_keyword dynamic)) (identifier a) (default_argument = (expression (literal 2)))) , (fixed_parameter (parameter_modifier (parameter_mode_modifier ref)) (type (contextual_keyword dynamic)) (identifier c) (default_argument = (expression (explictly_typed_default default ( (type (contextual_keyword dynamic)) )))))) , (parameter_array params (array_type (non_array_type (contextual_keyword dynamic)) (rank_specifier [ ]) (rank_specifier [ ])) (identifier c))) )) (method_body (block { })))) (class_member_declaration (method_declaration (method_modifiers (method_modifier (ref_method_modifier public)) (method_modifier (ref_method_modifier override))) (return_type (class_type string)) (method_header (member_name (identifier ToString)) ( )) (method_body (block { (statement_list (return_statement return (expression (invocation_expression (primary_expression (base_access base . (identifier ToString))) ( ))) ;)) })))) (class_member_declaration (method_declaration (method_modifiers (method_modifier (ref_method_modifier public)) partial) (return_type void) (method_header (member_name (identifier OnError)) ( )) (method_body ;))) (class_member_declaration (method_declaration (method_modifiers (method_modifier (ref_method_modifier public)) partial) (return_type void) (method_header (member_name (identifier method)) ( )) (method_body (block { (statement_list (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (array_type (non_array_type (nullable_value_type (non_nullable_value_type (integral_type int)) (nullable_type_annotation ?))) (rank_specifier [ ]))) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier a) = (local_variable_initializer (array_creation_expression new (non_array_type (nullable_value_type (non_nullable_value_type (integral_type int)) (nullable_type_annotation ?))) [ (expression_list (literal 5)) ])))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (array_type (non_array_type (integral_type int)) (rank_specifier [ ]))) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier (contextual_keyword var)) = (local_variable_initializer (array_initializer { (variable_initializer_list (variable_initializer (literal 1)) , (variable_initializer (literal 2)) , (variable_initializer (literal 3)) , (variable_initializer (literal 4)) , (variable_initializer (literal 5))) })))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (integral_type int)) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier i) = (local_variable_initializer (element_access (primary_expression (identifier a)) [ (argument_list (identifier i)) ])))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (namespace_or_type_name (identifier Foo) (type_argument_list < (type_argument (identifier T)) >))) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier f) = (local_variable_initializer (object_creation_expression new (type (namespace_or_type_name (identifier Foo) (type_argument_list < (type_argument (integral_type int)) >))) ( ))))))) ;)) (statement (expression_statement (statement_expression (invocation_expression (primary_expression (member_access (primary_expression (identifier f)) . (identifier method))) ( ))) ;)) (statement (expression_statement (statement_expression (assignment (unary_expression (identifier i)) (assignment_operator =) (expression (inclusive_or_expression (inclusive_or_expression (and_expression (and_expression (additive_expression (additive_expression (additive_expression (identifier i)) + (multiplicative_expression (identifier i))) - (multiplicative_expression (multiplicative_expression (multiplicative_expression (multiplicative_expression (identifier i)) * (range_expression (identifier i))) / (range_expression (identifier i))) % (range_expression (identifier i))))) & (equality_expression (identifier i)))) | (exclusive_or_expression (exclusive_or_expression (identifier i)) ^ (and_expression (identifier i))))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (simple_type bool)) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier b) = (local_variable_initializer (inclusive_or_expression (inclusive_or_expression (and_expression (and_expression (boolean_literal true)) & (equality_expression (boolean_literal false)))) | (exclusive_or_expression (exclusive_or_expression (boolean_literal true)) ^ (and_expression (boolean_literal false))))))))) ;))) })))) }))) })))) diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-O/Reference/sample.tree.svg b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-O/Reference/sample.tree.svg index 515bf538c..febbbbcfa 100644 --- a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-O/Reference/sample.tree.svg +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-O/Reference/sample.tree.svg @@ -451,1820 +451,1820 @@ - - -rank_specifier + + +type_argument - - + + +class_member_declaration + + + +) + + + identifier - - -3 + + +UndocumentedKeywords - - -exclusive_or_expression + + +array_initializer + + + +inclusive_or_expression + + + +( + + + +type + + + +parameter_modifier array_type - - -explicitly_typed_local_variable_declarators + + +type_argument - - -identifier + + +] - - -; + + +class_type - - -exclusive_or_expression + + +multiplicative_expression - - + + identifier - - -method + + +method_body - - -unary_expression + + += - - -identifier + + +; - - -expression_statement + + +integral_type - - -Params + + +b - - -member_name + + +new - - -nullable_value_type + + +( - - -type + + +parameter_list - - -override + + +multiplicative_expression - - -member_access + + +type - - -out + + +type - - -] + + +method - - -local_variable_declaration + + +identifier - - -parameter_mode_modifier + + +a - - -; + + +dynamic - - -} + + +yield - - -primary_expression + + +2 - - -< + + +explicitly_typed_local_variable_declaration - - -type + + +expression_list - - -< + + +dynamic - - -method_header + + +identifier - - -i + + +non_array_type - - -array_initializer + + +expression - - -inclusive_or_expression + + +default_argument - - -parameter_array + + +method_modifier - - -method_header + + +dynamic - - -rank_specifier + + +explictly_typed_default - - -statement + + +class - - -statement + + +default_argument - - -class_declaration + + +, - - -compilation_unit - - - -method_modifiers - - - -element_access + + +identifier - - + + i - - -true + + +expression - - -Comments + + +prog - - + + ) - - -literal + + +contextual_keyword - - -Foo + + +variable_initializer - - -local_variable_initializer + + +parameter_array - - -integral_type + + +contextual_keyword - - -expression + + +identifier - - -% + + +} - - + + , - - -c - - - -yield - - - -{ - - - -explicitly_typed_local_variable_declarators - - - -fixed_parameter - - - -( - - - -{ - - - -non_array_type - - - -boolean_literal - - - -prog + + +b var - - -ref_method_modifier - - - -; - - - -method_body - - - -[ - - - -type - - - -, - - - -[ - - - -class_type - - - -statement_expression - - - -statement + + += - - -declaration_statement + + +unary_expression - - -T + + +identifier namespace_or_type_name - - -integral_type - - - -statement_expression - - - -unary_expression - - - -method_declaration - - - -base - - - -a + + +i - - -parameter_list + + +expression - - -assignment + + +identifier - - -OnError + + +primary_expression - - -parameter_mode_modifier + + +{ - - -( + + +primary_expression - - -nullable_value_type + + +int - - -) + + +dynamic - - + + non_array_type - - -identifier - - - -] - - - -statement + + +declaration_statement - - -method_modifiers + + +primary_expression - - -method_body + + +return - - -ref_method_modifier + + +argument_list - - + + identifier - - -expression - - - -base_access - - - -type - - - -contextual_keyword - - - -) - - - -{ + + +identifier - - -integral_type + + +XmlComments - - -explicitly_typed_local_variable_declaration + + +out - - -parameter_modifier + + +local_variable_initializer - - -declaration_statement + + +ref - - -expression_list + + +i - - -; + + +member_name - - -Foo + + +method_modifiers - - -fixed_parameter + + +parameter_mode_modifier - - -identifier + + +type - - -) + + +method_modifiers - - + + dynamic - - -] + + +fixed_parameter - - -} + + +Foo - - -namespace + + +identifier - - -true + + +{ - - -method_modifier + + +explicitly_typed_local_variable_declaration - - -5 + + +c - - -void + + +contextual_keyword - - -i + + +namespace_declaration - - -parameter_modifier + + +compilation_unit - - -integral_type + + +{ - - + + = - - -non_array_type + + +block - - -b + + +class_member_declaration - - -parameter_modifier + + +inclusive_or_expression - - -non_array_type + + +{ - - -identifier + + +statement - - -identifier + + +true - - -non_array_type + + +public - - -identifier + + +; local_variable_initializer - - -and_expression - - - -identifier + + +dynamic - - -method_modifier + + +[ - - -? + + +literal - - -inclusive_or_expression + + +parameter_list - - -method_body + + +integral_type - - -, + + +f - - -boolean_literal + + +additive_expression - - -int + + +namespace_member_declaration - - -type_argument_list + + +new - - -1 + + +literal - - -params + + ++ - - -variable_initializer + + +a - - -} + + +parameter_modifier - - -method_declaration + + += - - -declaration_statement + + +, - - + + identifier - - -variable_initializer - - - -XmlComments - - - -type - - - -additive_expression + + +bool - - -expression + + +statement_list - - -UndocumentedKeywords + + +{ - - -) + + +local_variable_initializer - - -( + + +parameter_modifier - - -a + + +1 - - -local_variable_initializer + + +expression - - -variable_initializer + + +rank_specifier - - -- + + +additive_expression - - -multiplicative_expression + + +. - - -and_expression + + +identifier - - -namespace_declaration + + +declaration_statement - - -out + + +int - - + + boolean_literal - - -explicitly_typed_local_variable_declarator + + +Foo + + + +{ ) - - -, + + +params - - -literal + + +statement - - -and_expression + + +partial - - -] + + +i - - -^ + + +5 - - -new + + +method_modifiers - - -dynamic + + +fixed_parameters - - -partial + + +namespace - - -dynamic + + +array_type - - -contextual_keyword + + +boolean_literal - - -i + + +explicitly_typed_local_variable_declaration - - -> + + +and_expression - - -| + + +and_expression - - -class_member_declaration + + +contextual_keyword - - -; + + +method_modifiers - - -contextual_keyword + + +statement - - -literal + + +integral_type - - -inclusive_or_expression + + +identifier - - -. + + +ref_method_modifier - - + + identifier - - -4 + + +identifier - - -public + + +method_body - - -i + + +and_expression - - -= + + +explicitly_typed_local_variable_declaration - - -f + + +local_variable_initializer - - -fixed_parameter + + +local_variable_declaration - - -explicitly_typed_local_variable_declaration + + +a - - -statement + + +explicitly_typed_local_variable_declarators - - + + +] + + + identifier - - -parameter_list + + +> + + + +int + + + +( + + + +nullable_value_type member_name - - -statement_list + + +& + + + +Comments + + + +integral_type } + + +] + + + +and_expression + + + +rank_specifier + + + +* + + + +range_expression + namespace_body - - -contextual_keyword + + +void - - + + +identifier + + + +method_header + + + +{ + + + +[ + + + type - - -variable_initializer + + +identifier - - -namespace_or_type_name + + +range_expression - - -block + + +; - - -local_variable_declaration + + +i - - + + +method_header + + + int - - -. + + +expression_statement - - -{ + + +identifier - - -* + + +ref_method_modifier - - -method_modifier + + +i - - -2 + + +statement_expression - - -identifier + + +. - - -identifier + + +method_modifier - - -= + + +base_access - - -explicitly_typed_local_variable_declaration + + +; - - -nullable_type_annotation + + +statement - - -& + + +method - - -identifier + + +element_access - - -variable_initializer + + +block - - -local_variable_declaration + + +default - - -explicitly_typed_local_variable_declarator + + +non_nullable_value_type - - -parameter_mode_modifier + + +3 - - -[ + + +a - - -primary_expression + + +, - - -return_type + + +array_creation_expression - - -member_name + + +non_array_type - - -( + + +4 - - -default_argument + + +contextual_keyword - - -rank_specifier + + +partial - - + + +explicitly_typed_local_variable_declarator + + + identifier - - -primary_expression + + +) - - -local_variable_initializer + + +method_modifiers - - -i + + +literal + + + +identifier + + + +type_argument_list - - -method_body + + +declaration_statement - - -method_declaration + + +member_name - - -( + + +literal - - -ToString + + +rank_specifier - - -, + + +i - - -additive_expression + + +non_nullable_value_type - - -5 + + +? - - -identifier + + +type - - -contextual_keyword + + +multiplicative_expression - - -explicitly_typed_local_variable_declarators + + +method_declaration - - -method_body + + +ref - - -exclusive_or_expression + + +override invocation_expression - - -invocation_expression + + +literal - - -identifier + + +} - - -identifier + + +} - - -method_modifier + + +method_declaration - - -return + + +parameter_modifier - - -, + + +> - - -, + + +[ - - -explicitly_typed_local_variable_declarator + + +} - - -method_header + + +method_declaration - - -explicitly_typed_local_variable_declarator + + +[ - - -parameter_modifier + + += - - -) + + +type - - -int + + +c - - -int + + +; - - -identifier + + +| - - -= + + +contextual_keyword - - -statement_list + + +exclusive_or_expression - - -ToString + + +fixed_parameters - - -return_type + + +variable_initializer - - -default_argument + + +local_variable_declaration - - -statement + + +int - - -type + + +% - - + + identifier - - -namespace_member_declaration + + +) + + + +2 + + + +parameter_mode_modifier + + + +[ + + + +] ( - - + + +false + + + identifier - - -equality_expression + + +return_statement - - -partial + + +invocation_expression + + + +class_body + + + +nullable_type_annotation - - -block + + +public - - -; + + +method_body - - + + f - - -} - contextual_keyword - - -method_modifiers - - - -string + + +block - - -local_variable_declaration + + +method_body - - -^ + + +assignment - - -return_type + + +simple_type - - -c + + +statement_expression - - -member_name + + +non_array_type - - -literal + + +void - - -explicitly_typed_local_variable_declarators + + +type - - -integral_type + + +& - - -assignment_operator + + +ref_method_modifier - - -dynamic + + +identifier - - + + identifier - - -and_expression + + +T - - -equality_expression + + +parameter_mode_modifier - - -c + + +( - - -{ + + +; - - -class_member_declaration + + +namespace_or_type_name - - -type + + +method_modifier - - -public + + +fixed_parameter - - -nullable_type_annotation + + +void - - -array_type + + +and_expression - - -= + + +Params - - -literal + + +non_array_type - - -identifier + + +local_variable_declaration - - -] + + +method_header - - + + +out + + + +} + + + +explicitly_typed_local_variable_declarators + + + +i + + + identifier - - -multiplicative_expression + + +block - - -array_type + + +/ - - -boolean_literal + + +Params - - -2 + + +identifier - - -primary_expression + + +class_member_declaration - - + + += + + + i - - -false + + +( - - -{ + + +) - - -class_member_declaration + + +statement_list + + + +statement + + + +ToString - - -return_type + + +qualified_identifier - - -/ + + +explicitly_typed_local_variable_declarator - - -identifier + + +additive_expression - - -explicitly_typed_local_variable_declaration + + +local_variable_declaration - - -rank_specifier + + +parameter_array - - -and_expression + + +method_body - - -ref + + +identifier - - -method_modifiers + + +exclusive_or_expression - - -object_creation_expression + + +rank_specifier - - -fixed_parameters + + +statement - - -} + + +variable_initializer_list - - -non_nullable_value_type + + +. - - -literal + + +local_variable_initializer - - -method_header + + +< - - -> + + +parameter_mode_modifier - - -member_name + + +) - - -class_member_declaration + + +nullable_type_annotation - - + + ; - - -simple_type + + +return_type - - -default + + +i - - -] + + +multiplicative_expression - - -type_argument_list + + +identifier expression_statement - - -[ + + +identifier - - -argument_list + + +method_declaration - - -explicitly_typed_local_variable_declarator + + +variable_initializer - - -method + + +variable_initializer - - -multiplicative_expression + + +, - - -statement + + +void - - -? + + +identifier - - -block + + +type - - -declaration_statement + + +range_expression - - -additive_expression + + +array_type - - -identifier + + +literal - - -identifier + + +class_member_declaration - - -identifier + + +statement - - -explicitly_typed_local_variable_declarators + + +boolean_literal - - -void + + +return_type - - -type + + +return_type - - -i + + +; + + + +method_declaration + + + +explicitly_typed_local_variable_declarator ( - - -a + + +] + + + +member_name + + + +variable_initializer - - -i + + +explicitly_typed_local_variable_declarator - - -declaration_statement + + +| - - -literal + + +member_access - - -variable_initializer_list + + +explicitly_typed_local_variable_declarators - - -expression + + +identifier - - -local_variable_declaration + + +nullable_value_type - - -contextual_keyword + + +equality_expression - - -= + + +fixed_parameter - - + + +string + + + type - - -i + + +explicitly_typed_local_variable_declarators - - -. + + +^ - - -b + + +identifier - - -multiplicative_expression + + +class_declaration - - -parameter_array + + += - - -unary_expression + + +, - - -method_modifiers + + +dynamic - - -method_declaration + + +OnError - - -identifier + + +integral_type - - -identifier + + +inclusive_or_expression - - -} + + +( - - -) + + +and_expression - - -multiplicative_expression + + +false - - + + +exclusive_or_expression + + + identifier - - -method_declaration + + +rank_specifier - - -bool + + +explicitly_typed_local_variable_declaration - - -& + + +assignment_operator - - -[ + + +exclusive_or_expression - - -identifier + + +; - - -, + + +contextual_keyword - - -a + + +array_type - - -class_member_declaration + + +) - - -class_body + + +contextual_keyword - - -fixed_parameter + + +5 - - -identifier + + +equality_expression - - -method_header + + +ToString - - -| + + +return_type - - -and_expression + + +) - - -inclusive_or_expression + + +method_header - - -type_argument + + +c - - + + [ - - -type_argument - - - -void + + +explicitly_typed_local_variable_declarators - - -explictly_typed_default + + +public - - -block + + +ref_method_modifier - - + + identifier - - -public - - - -return_type + + +class_member_declaration - - -i + + +, - - -= + + +declaration_statement - - -( + + +method_modifier - - -exclusive_or_expression + + +local_variable_declaration - - + + type - - -parameter_mode_modifier - - - -local_variable_initializer + + +} - - -ref_method_modifier + + +inclusive_or_expression - - -array_type + + +literal - - -; + + +base - - -class + + +i - - -return_statement + + +params - - + + . - - -dynamic + + +[ - - -= + + +, ] - - -contextual_keyword - - - -int - - - -dynamic + + += - - -{ + + +primary_expression - - -[ + + +^ - - -+ + + +member_name - - -array_creation_expression + + +< - - -contextual_keyword + + +explicitly_typed_local_variable_declarator - - + + identifier - - -unary_expression - - - -ref - - - -params - - - -explicitly_typed_local_variable_declaration - - - -new + + +fixed_parameter - - -false + + +method_header - - -; + + +declaration_statement - - + + i - - -( + + +- - - -fixed_parameters + + +return_type - - -qualified_identifier + + +? - - -dynamic + + +object_creation_expression - - -) + + +] - - -rank_specifier + + +type_argument_list - - -Params + + +multiplicative_expression - - -non_nullable_value_type + + +boolean_literal - - -ref_method_modifier + + +( - - -void + + +true + + + +identifier \ No newline at end of file diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-R/Reference/sample.gruntree.red.txt b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-R/Reference/sample.gruntree.red.txt index 759035fb6..e86bc5836 100644 --- a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-R/Reference/sample.gruntree.red.txt +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-R/Reference/sample.gruntree.red.txt @@ -116,7 +116,7 @@ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ * ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ -⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 3 @@ -136,7 +136,7 @@ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ * ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ -⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 4 @@ -320,7 +320,7 @@ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ % ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ -⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 2 diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-R/Reference/sample.tree.red.txt b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-R/Reference/sample.tree.red.txt index a0521fec2..26972d351 100644 --- a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-R/Reference/sample.tree.red.txt +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-R/Reference/sample.tree.red.txt @@ -1 +1 @@ -(prog (compilation_unit (namespace_declaration namespace (qualified_identifier (identifier Comments) . (identifier XmlComments) . (identifier UndocumentedKeywords)) (namespace_body { (namespace_member_declaration (class_declaration class (identifier CSharp6Features) (class_body { (class_member_declaration (method_declaration (method_modifiers (method_modifier async)) (return_type void) (method_header (member_name (identifier Test)) ( )) (method_body (block { (statement_list (statement (expression_statement (statement_expression (invocation_expression (primary_expression (identifier WriteLine)) ( (argument_list (invocation_expression (primary_expression (identifier Sqrt)) ( (argument_list (additive_expression (additive_expression (multiplicative_expression (multiplicative_expression (literal 3)) * (unary_expression (literal 3)))) + (multiplicative_expression (multiplicative_expression (literal 4)) * (unary_expression (literal 4))))) ))) ))) ;)) (statement (expression_statement (statement_expression (invocation_expression (primary_expression (identifier WriteLine)) ( (argument_list (additive_expression (additive_expression (identifier Friday)) - (multiplicative_expression (identifier Monday)))) ))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier range) = (expression (invocation_expression (primary_expression (identifier Range)) ( (argument_list (argument (literal 5)) , (argument (literal 17))) )))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier even) = (expression (invocation_expression (primary_expression (member_access (primary_expression (identifier range)) . (identifier Where))) ( (argument_list (lambda_expression (anonymous_function_signature (identifier i)) => (anonymous_function_body (equality_expression (equality_expression (multiplicative_expression (multiplicative_expression (identifier i)) % (unary_expression (literal 2)))) == (relational_expression (literal 0)))))) )))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (nullable_value_type (non_nullable_value_type (integral_type int)) (nullable_type_annotation ?))) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier length) = (local_variable_initializer (null_conditional_member_access (primary_expression (identifier customers)) ? . (identifier Length))))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (identifier Customer)) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier first) = (local_variable_initializer (null_conditional_element_access (primary_expression (identifier customers)) ? [ (argument_list (literal 0)) ])))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (integral_type int)) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier length) = (local_variable_initializer (null_coalescing_expression (conditional_or_expression (null_conditional_member_access (primary_expression (identifier customers)) ? . (identifier Length))) ?? (null_coalescing_expression (literal 0)))))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (nullable_value_type (non_nullable_value_type (integral_type int)) (nullable_type_annotation ?))) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier first) = (local_variable_initializer (null_conditional_member_access (primary_expression (null_conditional_member_access (primary_expression (null_conditional_element_access (primary_expression (identifier customers)) ? [ (argument_list (literal 0)) ])) ? . (identifier Orders))) ? . (identifier Count) (dependent_access ( )))))))) ;)) (statement (expression_statement (statement_expression (null_conditional_invocation_expression (null_conditional_member_access (primary_expression (identifier PropertyChanged)) ? . (identifier Invoke)) ( (argument_list (argument (this_access this)) , (argument (identifier args))) ))) ;))) })))) }))) })))) +(prog (compilation_unit (namespace_declaration namespace (qualified_identifier (identifier Comments) . (identifier XmlComments) . (identifier UndocumentedKeywords)) (namespace_body { (namespace_member_declaration (class_declaration class (identifier CSharp6Features) (class_body { (class_member_declaration (method_declaration (method_modifiers (method_modifier async)) (return_type void) (method_header (member_name (identifier Test)) ( )) (method_body (block { (statement_list (statement (expression_statement (statement_expression (invocation_expression (primary_expression (identifier WriteLine)) ( (argument_list (invocation_expression (primary_expression (identifier Sqrt)) ( (argument_list (additive_expression (additive_expression (multiplicative_expression (multiplicative_expression (literal 3)) * (range_expression (literal 3)))) + (multiplicative_expression (multiplicative_expression (literal 4)) * (range_expression (literal 4))))) ))) ))) ;)) (statement (expression_statement (statement_expression (invocation_expression (primary_expression (identifier WriteLine)) ( (argument_list (additive_expression (additive_expression (identifier Friday)) - (multiplicative_expression (identifier Monday)))) ))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier range) = (expression (invocation_expression (primary_expression (identifier Range)) ( (argument_list (argument (literal 5)) , (argument (literal 17))) )))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier even) = (expression (invocation_expression (primary_expression (member_access (primary_expression (identifier range)) . (identifier Where))) ( (argument_list (lambda_expression (anonymous_function_signature (identifier i)) => (anonymous_function_body (equality_expression (equality_expression (multiplicative_expression (multiplicative_expression (identifier i)) % (range_expression (literal 2)))) == (relational_expression (literal 0)))))) )))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (nullable_value_type (non_nullable_value_type (integral_type int)) (nullable_type_annotation ?))) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier length) = (local_variable_initializer (null_conditional_member_access (primary_expression (identifier customers)) ? . (identifier Length))))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (identifier Customer)) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier first) = (local_variable_initializer (null_conditional_element_access (primary_expression (identifier customers)) ? [ (argument_list (literal 0)) ])))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (integral_type int)) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier length) = (local_variable_initializer (null_coalescing_expression (conditional_or_expression (null_conditional_member_access (primary_expression (identifier customers)) ? . (identifier Length))) ?? (null_coalescing_expression (literal 0)))))))) ;)) (statement (declaration_statement (local_variable_declaration (explicitly_typed_local_variable_declaration (type (nullable_value_type (non_nullable_value_type (integral_type int)) (nullable_type_annotation ?))) (explicitly_typed_local_variable_declarators (explicitly_typed_local_variable_declarator (identifier first) = (local_variable_initializer (null_conditional_member_access (primary_expression (null_conditional_member_access (primary_expression (null_conditional_element_access (primary_expression (identifier customers)) ? [ (argument_list (literal 0)) ])) ? . (identifier Orders))) ? . (identifier Count) (dependent_access ( )))))))) ;)) (statement (expression_statement (statement_expression (null_conditional_invocation_expression (null_conditional_member_access (primary_expression (identifier PropertyChanged)) ? . (identifier Invoke)) ( (argument_list (argument (this_access this)) , (argument (identifier args))) ))) ;))) })))) }))) })))) diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-R/Reference/sample.tree.svg b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-R/Reference/sample.tree.svg index 8937fa3ad..5a1cdd607 100644 --- a/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-R/Reference/sample.tree.svg +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-R/Reference/sample.tree.svg @@ -307,1244 +307,1244 @@ - - + + +return_type + + + +primary_expression + + + identifier - - -nullable_type_annotation + + +) - - + + +customers + + + = - - + + +qualified_identifier + + + +expression_statement + + + +literal + + + +0 + + + +; + + + identifier - - -3 + + +Test - - + + primary_expression - - -range + + +identifier - - -4 + + +local_variable_declaration + + + +null_conditional_member_access + + + +statement_list + + + +explicitly_typed_local_variable_declarators literal - - -primary_expression - - - -] - - - -i + + +- - - -identifier + + +statement - - -argument_list + + +Invoke additive_expression - - -null_conditional_member_access - - - -type - - - -. - - - -) + + +identifier - - -statement + + +identifier argument_list - - -identifier + + +literal - - -explicitly_typed_local_variable_declarator + + +i - - -expression_statement + + +primary_expression - - + + identifier - - -multiplicative_expression + + += - - -) + + +Orders implicitly_typed_local_variable_declaration - - -primary_expression + + +; - - -type + + +null_conditional_invocation_expression - - -method_body + + +. - - -int + + +nullable_type_annotation - - + + +var + + + +) + + + +; + + + identifier - - -Friday + + +integral_type - - -? + + +identifier - - -= + + +non_nullable_value_type + + + +local_variable_declaration + + + +identifier first - - -argument - - - -statement_list + + +argument_list - - -; + + +local_variable_initializer - - -customers + + +method_header - - -primary_expression - - - -primary_expression - - - -namespace_declaration - - - -literal - - - -non_nullable_value_type - - - -null_conditional_member_access - - - -primary_expression - - - -declaration_statement + + +statement - - -block + + +explicitly_typed_local_variable_declarator - - -5 + + +; - - -null_conditional_invocation_expression + + +explicitly_typed_local_variable_declarators - - -? + + +) statement_expression - - -Length + + +int - - -implicitly_typed_local_variable_declarator + + +null_coalescing_expression - - -?? + + +statement - - -identifier + + +namespace_body - - -. + + +identifier - - -literal + + +additive_expression - - -explicitly_typed_local_variable_declaration + + +invocation_expression - - -literal + + +? - - -explicitly_typed_local_variable_declarators + + +statement - - -( + + +% - - -invocation_expression + + +explicitly_typed_local_variable_declarator - - -( + + +type - - -identifier + + +i - - -identifier + + +. - - -WriteLine + + +implicitly_typed_local_variable_declarator - - -equality_expression + + +primary_expression - - -argument + + +null_conditional_member_access - - -nullable_value_type + + +type - - -identifier + + +this - - -multiplicative_expression + + +WriteLine - - -literal + + +declaration_statement ( - - -argument_list - - - -compilation_unit - - - -identifier - identifier - - -Range - - - -. - - - -identifier - - - -declaration_statement + + +conditional_or_expression - - -=> + + +args - - -primary_expression + + +expression - - -explicitly_typed_local_variable_declarators + + +} - - -. + + +( - - + + local_variable_initializer - - -statement_expression + + +type - - + + +? + + + ( - - -statement + + +?? - - -prog + + +identifier - - + + +range_expression + + + ; - - + + argument + + +invocation_expression + + + +? + + + +; + + + +PropertyChanged + + + +local_variable_initializer + + + +primary_expression + + + +( + + + +explicitly_typed_local_variable_declarators + + + +class_member_declaration + + + +length + identifier - - -explicitly_typed_local_variable_declaration - - - -namespace_member_declaration + + +2 - - -== + + +primary_expression - - -( + + +implicitly_typed_local_variable_declarator statement - - -Where - - - -invocation_expression + + +explicitly_typed_local_variable_declarator - - -argument_list + + +statement - - -argument_list + + +namespace - - -explicitly_typed_local_variable_declaration + + +CSharp6Features - - -; + + +5 - - -) + + +. = - - -) - - - -] - - - + + int - - -. - - - -this_access - - - -local_variable_initializer - - - + + [ - - -argument + + +( - - + + identifier - - -implicitly_typed_local_variable_declaration - - - -local_variable_initializer - - - -CSharp6Features - - - -argument_list + + +multiplicative_expression - - -; + + +WriteLine - - -= + + +nullable_value_type - - -literal + + +identifier - - -{ + + +statement_expression - - + + literal - - -Sqrt - - - -% + + +* - - -{ + + +invocation_expression - - -identifier + + +expression - - -literal + + +local_variable_declaration - - -nullable_type_annotation + + +argument_list - - -identifier + + +nullable_value_type - - -* + + +this_access statement - - -expression_statement - - - -Comments - - - -primary_expression - - - -range - - - -this - - - -multiplicative_expression + + +Monday - - + + argument_list - - -null_coalescing_expression + + +identifier - - -} + + +( - - -conditional_or_expression + + +multiplicative_expression - - + + identifier - - -class_declaration + + +null_conditional_element_access - - -statement + + +4 - - + + local_variable_declaration - - + + identifier - - -statement - - - -method_modifier - - - -length - - - -argument_list - - - -multiplicative_expression + + +primary_expression - - -+ + + +argument - - + + identifier - - -local_variable_declaration - - - -( - - - -explicitly_typed_local_variable_declarators - - - -, - - - -nullable_value_type + + +0 - - -expression_statement + + +] - - + + ? - - -identifier - - - -identifier - - - -identifier + + +3 - - -identifier + + +Length - - -Invoke + + +length - - -. + + +{ - - -* + + +literal - - -integral_type + + +customers - - -null_conditional_member_access + + +multiplicative_expression - - -lambda_expression + + +argument 17 - - -2 - - - -3 + + +identifier UndocumentedKeywords - - -multiplicative_expression - - - -declaration_statement - - - -dependent_access + + +explicitly_typed_local_variable_declaration - - + + primary_expression - - -var + + +identifier - - -multiplicative_expression + + +int - - -statement + + +4 - - -explicitly_typed_local_variable_declarators + + +3 - - -statement + + +equality_expression - - -) + + +Comments - - -identifier + + +statement_expression - - -unary_expression + + +method_modifier - - -identifier + + +block - - -equality_expression + + +Friday + + + +void + + + +primary_expression + + + +member_name + + + +=> + + + +literal + + + +additive_expression identifier - - -args - - - -null_conditional_member_access + + +multiplicative_expression - - -literal + + +) - - -( + + +primary_expression - - -integral_type + + +null_conditional_member_access ? - - -Customer + + +. - - -Monday + + +. - - -declaration_statement + + +} - - -explicitly_typed_local_variable_declarator + + +. - - -[ + + +async - - -multiplicative_expression + + +method_body - - -0 + + +primary_expression - - -{ + + +Where - - -identifier + + +member_access + + + +] XmlComments - - -explicitly_typed_local_variable_declarator + + +multiplicative_expression - - + + identifier + + +( + + + +) + identifier - - -statement + + +local_variable_declaration - - -0 + + +( - - -? + + +class - - -Test + + +; - - -0 + + +customers - - -null_conditional_member_access + + +expression_statement - - -i + + +anonymous_function_body - - -type + + +* - - -Orders + + +range - - -qualified_identifier + + +explicitly_typed_local_variable_declarator - - -0 + + +, - - -customers + + +0 - - -null_conditional_element_access + + +null_conditional_member_access - - -invocation_expression + + +nullable_type_annotation - - + + additive_expression - - -member_name + + +multiplicative_expression - - -expression + + +argument_list - - -method_declaration + + +Range - - -. + + +local_variable_initializer - - -class + + +compilation_unit - - -- + + +invocation_expression - - -= + + +argument - - -namespace + + +null_conditional_element_access - - -anonymous_function_signature + + +dependent_access - - -non_nullable_value_type + + +local_variable_declaration - - -type + + +identifier + + + +declaration_statement + + + +declaration_statement declaration_statement - - -WriteLine + + +identifier - - -? + + +namespace_member_declaration - - -additive_expression + + +. - - -invocation_expression + + +primary_expression + + + +integral_type + + + +, + + + +lambda_expression + + + +literal + + + +) + + + +Count primary_expression - - -null_conditional_element_access + + +0 - - -local_variable_declaration + + +anonymous_function_signature - - -} + + +Length - - -class_body + + +even - - -local_variable_declaration + + +null_coalescing_expression - - -implicitly_typed_local_variable_declarator + + +range_expression - - -; + + +relational_expression - - -async + + +literal - - -method_modifiers + + +implicitly_typed_local_variable_declaration - - -) + + +expression_statement + + + +explicitly_typed_local_variable_declaration var - - -? - - - -= + + +multiplicative_expression - - -primary_expression + + +namespace_declaration - - -local_variable_declaration + + +argument_list - - -; + + +[ - - + + identifier - - -method_header + + +== - - -statement_expression + + +method_modifiers - - -. + + +Customer - - -namespace_body + + += - - -expression + + +identifier - - -even + + +? - - + + +range_expression + + + +prog + + + ; - - -Length + + +declaration_statement - - -unary_expression + + +class_body - - -literal + + +} - - -primary_expression + + +method_declaration - - -int + + += - - -additive_expression + + +{ - - -invocation_expression + + +identifier - - -customers + + +equality_expression - - -return_type + + +? - - -anonymous_function_body + + +argument_list - - -customers + + +{ - - -integral_type + + +declaration_statement - - -local_variable_declaration + + +? - - -local_variable_initializer + + +first - - -length + + +. - - -primary_expression + + +null_conditional_member_access - - -member_access + + +identifier - - -null_coalescing_expression + + +class_declaration - - -; + + +type - - -identifier + + +explicitly_typed_local_variable_declaration - - + + identifier - - -) + + +Sqrt - - -) + + +invocation_expression - - -PropertyChanged + + +range - - -first + + +statement - - -, + + +literal - - -explicitly_typed_local_variable_declaration + + +) - - -void + + +; - - -unary_expression + + += - - -class_member_declaration + + +identifier - - -( + + +non_nullable_value_type - - -relational_expression + + +integral_type - - -; + + ++ - - -? + + +explicitly_typed_local_variable_declaration - - -explicitly_typed_local_variable_declarator + + +literal - - -4 + + +identifier - - -literal + + +? - - -} + + +) - - -declaration_statement + + +argument_list - - -Count + + +customers - - -? + + +literal + + + +explicitly_typed_local_variable_declarators + + + +statement \ No newline at end of file diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.gruntree.red.txt b/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.gruntree.red.txt index d915780a3..c93e194b1 100644 --- a/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.gruntree.red.txt +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.gruntree.red.txt @@ -158,10 +158,10 @@ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ shift_expression ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ -⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ > ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ -⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ primary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ c diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.stderr.txt b/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.stderr.txt index 19ef2924c..6cbf4b5e8 100644 --- a/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.stderr.txt +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.stderr.txt @@ -1,3 +1,3 @@ line 10:12 no viable alternative at input '>' -line 10:14 extraneous input '>' expecting {'-', '--', '!', '(', '&', '+', '++', '~', 'add', 'alias', 'ascending', 'async', 'await', 'base', 'bool', 'by', 'byte', 'char', 'checked', 'decimal', 'delegate', 'descending', 'double', 'dynamic', 'equals', 'float', 'from', 'get', 'global', 'group', 'int', 'into', 'join', 'let', 'long', 'nameof', 'new', 'notnull', 'object', 'on', 'orderby', 'partial', 'remove', 'sbyte', 'select', 'set', 'short', 'sizeof', 'stackalloc', 'string', 'this', 'typeof', 'uint', 'ulong', 'unchecked', 'unmanaged', 'ushort', 'value', 'var', 'when', 'where', 'yield', 'default', 'null', 'true', 'false', '*', Simple_Identifier, Integer_Literal, Real_Literal, Character_Literal, String_Literal, Interpolated_Regular_String_Start, Interpolated_Verbatim_String_Start} +line 10:14 extraneous input '>' expecting {'-', '--', '!', '..', '(', '&', '^', '+', '++', '~', 'add', 'alias', 'ascending', 'async', 'await', 'base', 'bool', 'by', 'byte', 'char', 'checked', 'decimal', 'delegate', 'descending', 'double', 'dynamic', 'equals', 'float', 'from', 'get', 'global', 'group', 'int', 'into', 'join', 'let', 'long', 'nameof', 'new', 'notnull', 'object', 'on', 'orderby', 'partial', 'remove', 'sbyte', 'select', 'set', 'short', 'sizeof', 'stackalloc', 'string', 'this', 'typeof', 'uint', 'ulong', 'unchecked', 'unmanaged', 'ushort', 'value', 'var', 'when', 'where', 'yield', 'default', 'null', 'true', 'false', '*', Simple_Identifier, Integer_Literal, Real_Literal, Character_Literal, String_Literal, Interpolated_Regular_String_Start, Interpolated_Verbatim_String_Start} line 11:8 no viable alternative at input '>' diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.tree.red.txt b/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.tree.red.txt index bc5a48544..9319e7c52 100644 --- a/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.tree.red.txt +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.tree.red.txt @@ -1 +1 @@ -(prog (compilation_unit (class_declaration class (identifier RightShift) (class_body { (class_member_declaration (method_declaration method_modifiers (return_type void) (method_header (member_name (identifier RightShift)) ( )) (method_body (block { (statement_list (statement (expression_statement (statement_expression (assignment (unary_expression (identifier a)) (assignment_operator =) (expression (shift_expression (shift_expression (identifier b)) (right_shift > >) (additive_expression (identifier c)))))) ;)) (statement (expression_statement (statement_expression (assignment (unary_expression (identifier d)) (assignment_operator (right_shift_assignment > >=)) (expression (identifier e)))) ;)) (statement (expression_statement (statement_expression (assignment (unary_expression (identifier a)) (assignment_operator =) (expression (relational_expression (relational_expression (identifier b)) > (shift_expression (unary_expression > (primary_expression (identifier c)))))))) ;)) (statement (expression_statement (statement_expression (assignment (unary_expression (identifier d)) (assignment_operator > >=) (expression (identifier e)))) ;))) })))) })))) +(prog (compilation_unit (class_declaration class (identifier RightShift) (class_body { (class_member_declaration (method_declaration method_modifiers (return_type void) (method_header (member_name (identifier RightShift)) ( )) (method_body (block { (statement_list (statement (expression_statement (statement_expression (assignment (unary_expression (identifier a)) (assignment_operator =) (expression (shift_expression (shift_expression (identifier b)) (right_shift > >) (additive_expression (identifier c)))))) ;)) (statement (expression_statement (statement_expression (assignment (unary_expression (identifier d)) (assignment_operator (right_shift_assignment > >=)) (expression (identifier e)))) ;)) (statement (expression_statement (statement_expression (assignment (unary_expression (identifier a)) (assignment_operator =) (expression (relational_expression (relational_expression (identifier b)) > (shift_expression (range_expression > (unary_expression (identifier c)))))))) ;)) (statement (expression_statement (statement_expression (assignment (unary_expression (identifier d)) (assignment_operator > >=) (expression (identifier e)))) ;))) })))) })))) diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.tree.svg b/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.tree.svg index a2f9245dc..721877c1e 100644 --- a/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.tree.svg +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v6/RightShift/Reference/sample.tree.svg @@ -73,10 +73,10 @@ - - - - + + + + @@ -94,392 +94,392 @@ - - -; - - - -right_shift_assignment + + +relational_expression - - -class_member_declaration + + +prog - - -block + + +> - - + + identifier - - -e - - - -unary_expression - - - -statement - - - -unary_expression - - - -class_declaration - - - -class - - - -statement_expression - - - + + expression_statement - - -> - assignment - - -method_body - - - -statement + + +right_shift_assignment - - + + identifier - - -d + + +expression - - -identifier + + +expression_statement - - -assignment + + +unary_expression + + + +identifier expression - - -relational_expression - identifier - - -RightShift - - - -RightShift + + +unary_expression - - -} + + +; - - -statement_list + + +shift_expression - - -primary_expression + + +void - - + + } - - -c + + +e - - -return_type + + +assignment_operator - - -identifier + + +; - - + + identifier - - -{ + + +( - - -= + + +block - - -identifier + + +assignment_operator - - -unary_expression + + +statement_list - - -assignment_operator + + +expression - - -> + + +statement_expression - - -> + + +method_declaration - - -; + + +identifier - - -b + + +shift_expression - - -; + + +{ - - -assignment + + +method_modifiers - - -c + + +unary_expression - - -relational_expression + + +statement - - -> + + +expression_statement - - + + identifier - - -statement_expression + + +range_expression - - ->= + + +additive_expression - - -prog + + +shift_expression - - -b + + +identifier - - -statement + + += - - -void + + +c - - -method_modifiers + + +assignment - - -) + + +expression - - -= + + +method_header - - -shift_expression + + +statement - - -member_name + + +c - - + + { - - -expression_statement + + +> - - + + identifier - - -right_shift - - - + + identifier - - -expression - - - -assignment_operator + + +class_member_declaration - - -d + + +assignment expression_statement - - -statement_expression + + +>= assignment_operator + + +; + + + +> + >= - - -; + + +class_declaration - - -( + + +identifier - - -shift_expression + + +statement a - - -class_body + + +; + + + +> + + + +unary_expression + + + +> + + + +) + + + +method_body + + + +d + + + +e a - - -expression + + +statement_expression - - -method_declaration + + +RightShift - - -expression + + +relational_expression - - -unary_expression + + +d compilation_unit - - -statement + + +> - - -e + + +statement_expression - - + + +RightShift + + + +member_name + + + unary_expression - - -method_header + + +statement - - + + +identifier + + + +return_type + + + assignment_operator - - -expression_statement + + +b - - -identifier + + +assignment + + + +b statement_expression - - -> - - - -> + + += - - -additive_expression + + +right_shift - - -identifier + + +} - - -assignment + + +class - - -shift_expression + + +class_body \ No newline at end of file diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v8/Element Access/ReadMe.md b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Element Access/ReadMe.md index 348083c6e..60ff2220b 100644 --- a/tools/GrammarTesting/Tests/Parsing/Samples/v8/Element Access/ReadMe.md +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Element Access/ReadMe.md @@ -9,4 +9,4 @@ The sample contains both valid and invalid samples, the semantic errors the latt produce are checked – the reference errors are in `Reference/sample.stderr.txt` The check is a semantic one only, the code still parses successfully and the parse tree -is checked for correctness as with other samples. \ No newline at end of file +is checked for correctness as with other samples. diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/ReadMe.md b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/ReadMe.md new file mode 100644 index 000000000..db692992f --- /dev/null +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/ReadMe.md @@ -0,0 +1 @@ +# Sample: Index & Range expressions diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.gruntree.red.txt b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.gruntree.red.txt new file mode 100644 index 000000000..babc97bfa --- /dev/null +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.gruntree.red.txt @@ -0,0 +1,1017 @@ +⎛ +⎜ prog +⎜ ⎛ +⎜ ⎜ compilation_unit +⎜ ⎜ ⎛ +⎜ ⎜ ⎜ class_declaration +⎜ ⎜ ⎜ class +⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ IndexAndRangeExpressions +⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ class_body +⎜ ⎜ ⎜ ⎜ { +⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ class_member_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ method_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ method_modifiers +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ return_type +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ void +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ method_header +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ member_name +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ IndexAndRangeExpressions_1 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ( +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ) +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ method_body +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ block +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ { +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement_list +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ a +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ^ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 1 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ b +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ^ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 1 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ c +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 0 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ d +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ e +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ object_creation_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ new +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ type +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ Struct +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ( +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ) +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ f +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ e +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ * +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 1 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 2 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ g +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ e +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ * +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ h +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ e +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ * +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 1 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ i +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ e +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ * +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 2 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ j +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ / +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ e +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ k +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ^ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 2 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ / +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ e +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ l +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ^ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 1 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ / +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ e +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ m +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ multiplicative_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ^ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 2 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ^ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 1 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ / +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ e +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ n +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 1 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ member_access +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ primary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ parenthesized_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ( +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 6 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ) +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ . +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ End +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ o +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ member_access +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ primary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ b +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ . +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ Start +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 5 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ p +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ member_access +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ primary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ parenthesized_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ( +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 1 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 3 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ) +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ . +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ Start +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 5 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ oops +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ parenthesized_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ( +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 1 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 3 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ) +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 5 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ oops +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 1 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ parenthesized_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ( +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 3 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 5 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ) +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ declaration_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declaration +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ var +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ implicitly_typed_local_variable_declarator +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ oops +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ = +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ range_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 1 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ unary_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ literal +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 3 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ .. +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ expression_statement +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ statement_expression +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 5 +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ; +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ } +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎜ ⎜ } +⎜ ⎜ ⎜ ⎝ +⎜ ⎜ ⎝ +⎜ ⎝ +⎝ diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.stderr.txt b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.stderr.txt new file mode 100644 index 000000000..8761e9bbd --- /dev/null +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.stderr.txt @@ -0,0 +1 @@ +line 24:21 mismatched input '..' expecting {'-', '--', '->', ';', '!', '!=', '?', '.', '(', '[', '&', '&&', '%', '^', '+', '++', '<', '<<', '<=', '==', '>', '>=', '|', '||', 'as', 'is', '*', '/'} diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.tokens.txt b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.tokens.txt new file mode 100644 index 000000000..53045c1f6 --- /dev/null +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.tokens.txt @@ -0,0 +1,176 @@ +[@0,0:4='class',<'class'>,1:0] +[@1,6:29='IndexAndRangeExpressions',,1:6] +[@2,31:31='{',<'{'>,2:0] +[@3,36:39='void',<'void'>,3:3] +[@4,41:66='IndexAndRangeExpressions_1',,3:8] +[@5,67:67='(',<'('>,3:34] +[@6,68:68=')',<')'>,3:35] +[@7,73:73='{',<'{'>,4:3] +[@8,81:83='var',<'var'>,5:6] +[@9,85:85='a',,5:10] +[@10,87:87='=',<'='>,5:12] +[@11,89:89='^',<'^'>,5:14] +[@12,90:90='1',,5:15] +[@13,91:91=';',<';'>,5:16] +[@14,99:101='var',<'var'>,6:6] +[@15,103:103='b',,6:10] +[@16,105:105='=',<'='>,6:12] +[@17,107:108='..',<'..'>,6:14] +[@18,109:109='^',<'^'>,6:16] +[@19,110:110='1',,6:17] +[@20,111:111=';',<';'>,6:18] +[@21,119:121='var',<'var'>,7:6] +[@22,123:123='c',,7:10] +[@23,125:125='=',<'='>,7:12] +[@24,127:127='0',,7:14] +[@25,128:129='..',<'..'>,7:15] +[@26,130:130=';',<';'>,7:17] +[@27,138:140='var',<'var'>,8:6] +[@28,142:142='d',,8:10] +[@29,144:144='=',<'='>,8:12] +[@30,146:147='..',<'..'>,8:14] +[@31,148:148=';',<';'>,8:16] +[@32,156:158='var',<'var'>,9:6] +[@33,160:160='e',,9:10] +[@34,162:162='=',<'='>,9:12] +[@35,164:166='new',<'new'>,9:14] +[@36,168:173='Struct',,9:18] +[@37,174:174='(',<'('>,9:24] +[@38,175:175=')',<')'>,9:25] +[@39,176:176=';',<';'>,9:26] +[@40,218:220='var',<'var'>,10:6] +[@41,222:222='f',,10:10] +[@42,224:224='=',<'='>,10:12] +[@43,226:226='e',,10:14] +[@44,228:228='*',<'*'>,10:16] +[@45,230:230='1',,10:18] +[@46,232:233='..',<'..'>,10:20] +[@47,235:235='2',,10:23] +[@48,236:236=';',<';'>,10:24] +[@49,244:246='var',<'var'>,11:6] +[@50,248:248='g',,11:10] +[@51,250:250='=',<'='>,11:12] +[@52,252:252='e',,11:14] +[@53,254:254='*',<'*'>,11:16] +[@54,256:257='..',<'..'>,11:18] +[@55,258:258=';',<';'>,11:20] +[@56,266:268='var',<'var'>,12:6] +[@57,270:270='h',,12:10] +[@58,272:272='=',<'='>,12:12] +[@59,274:274='e',,12:14] +[@60,276:276='*',<'*'>,12:16] +[@61,278:278='1',,12:18] +[@62,279:280='..',<'..'>,12:19] +[@63,281:281=';',<';'>,12:21] +[@64,289:291='var',<'var'>,13:6] +[@65,293:293='i',,13:10] +[@66,295:295='=',<'='>,13:12] +[@67,297:297='e',,13:14] +[@68,299:299='*',<'*'>,13:16] +[@69,301:302='..',<'..'>,13:18] +[@70,303:303='2',,13:20] +[@71,304:304=';',<';'>,13:21] +[@72,312:314='var',<'var'>,14:6] +[@73,316:316='j',,14:10] +[@74,318:318='=',<'='>,14:12] +[@75,320:321='..',<'..'>,14:14] +[@76,323:323='/',<'/'>,14:17] +[@77,325:325='e',,14:19] +[@78,326:326=';',<';'>,14:20] +[@79,334:336='var',<'var'>,15:6] +[@80,338:338='k',,15:10] +[@81,340:340='=',<'='>,15:12] +[@82,342:342='^',<'^'>,15:14] +[@83,343:343='2',,15:15] +[@84,344:345='..',<'..'>,15:16] +[@85,347:347='/',<'/'>,15:19] +[@86,349:349='e',,15:21] +[@87,350:350=';',<';'>,15:22] +[@88,358:360='var',<'var'>,16:6] +[@89,362:362='l',,16:10] +[@90,364:364='=',<'='>,16:12] +[@91,366:367='..',<'..'>,16:14] +[@92,369:369='^',<'^'>,16:17] +[@93,370:370='1',,16:18] +[@94,371:371='/',<'/'>,16:19] +[@95,372:372='e',,16:20] +[@96,373:373=';',<';'>,16:21] +[@97,381:383='var',<'var'>,17:6] +[@98,385:385='m',,17:10] +[@99,387:387='=',<'='>,17:12] +[@100,389:389='^',<'^'>,17:14] +[@101,390:390='2',,17:15] +[@102,392:393='..',<'..'>,17:17] +[@103,394:394='^',<'^'>,17:19] +[@104,395:395='1',,17:20] +[@105,397:397='/',<'/'>,17:22] +[@106,399:399='e',,17:24] +[@107,400:400=';',<';'>,17:25] +[@108,408:410='var',<'var'>,18:6] +[@109,412:412='n',,18:10] +[@110,414:414='=',<'='>,18:12] +[@111,416:416='1',,18:14] +[@112,417:418='..',<'..'>,18:15] +[@113,419:419='(',<'('>,18:17] +[@114,420:421='..',<'..'>,18:18] +[@115,423:423='6',,18:21] +[@116,424:424=')',<')'>,18:22] +[@117,425:425='.',<'.'>,18:23] +[@118,426:428='End',,18:24] +[@119,429:429=';',<';'>,18:27] +[@120,437:439='var',<'var'>,19:6] +[@121,441:441='o',,19:10] +[@122,443:443='=',<'='>,19:12] +[@123,445:445='b',,19:14] +[@124,446:446='.',<'.'>,19:15] +[@125,447:451='Start',,19:16] +[@126,452:453='..',<'..'>,19:21] +[@127,454:454='5',,19:23] +[@128,455:455=';',<';'>,19:24] +[@129,463:465='var',<'var'>,20:6] +[@130,467:467='p',,20:10] +[@131,469:469='=',<'='>,20:12] +[@132,471:471='(',<'('>,20:14] +[@133,472:472='1',,20:15] +[@134,473:474='..',<'..'>,20:16] +[@135,475:475='3',,20:18] +[@136,476:476=')',<')'>,20:19] +[@137,477:477='.',<'.'>,20:20] +[@138,478:482='Start',,20:21] +[@139,483:484='..',<'..'>,20:26] +[@140,485:485='5',,20:28] +[@141,486:486=';',<';'>,20:29] +[@142,501:503='var',<'var'>,22:6] +[@143,505:508='oops',,22:10] +[@144,510:510='=',<'='>,22:15] +[@145,512:512='(',<'('>,22:17] +[@146,513:513='1',,22:18] +[@147,514:515='..',<'..'>,22:19] +[@148,516:516='3',,22:21] +[@149,517:517=')',<')'>,22:22] +[@150,518:519='..',<'..'>,22:23] +[@151,520:520='5',,22:25] +[@152,521:521=';',<';'>,22:26] +[@153,561:563='var',<'var'>,23:6] +[@154,565:568='oops',,23:10] +[@155,570:570='=',<'='>,23:15] +[@156,572:572='1',,23:17] +[@157,573:574='..',<'..'>,23:18] +[@158,575:575='(',<'('>,23:20] +[@159,576:576='3',,23:21] +[@160,577:578='..',<'..'>,23:22] +[@161,579:579='5',,23:24] +[@162,580:580=')',<')'>,23:25] +[@163,581:581=';',<';'>,23:26] +[@164,621:623='var',<'var'>,24:6] +[@165,625:628='oops',,24:10] +[@166,630:630='=',<'='>,24:15] +[@167,632:632='1',,24:17] +[@168,633:634='..',<'..'>,24:18] +[@169,635:635='3',,24:20] +[@170,636:637='..',<'..'>,24:21] +[@171,638:638='5',,24:23] +[@172,639:639=';',<';'>,24:24] +[@173,680:680='}',<'}'>,25:3] +[@174,682:682='}',<'}'>,26:0] +[@175,683:682='',,26:1] diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.tree.red.txt b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.tree.red.txt new file mode 100644 index 000000000..2c5fdd8a8 --- /dev/null +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.tree.red.txt @@ -0,0 +1 @@ +(prog (compilation_unit (class_declaration class (identifier IndexAndRangeExpressions) (class_body { (class_member_declaration (method_declaration method_modifiers (return_type void) (method_header (member_name (identifier IndexAndRangeExpressions_1)) ( )) (method_body (block { (statement_list (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier a) = (expression (unary_expression ^ (unary_expression (literal 1))))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier b) = (expression (range_expression .. (unary_expression ^ (unary_expression (literal 1)))))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier c) = (expression (range_expression (unary_expression (literal 0)) ..))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier d) = (expression (range_expression ..))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier e) = (expression (object_creation_expression new (type (identifier Struct)) ( )))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier f) = (expression (multiplicative_expression (multiplicative_expression (identifier e)) * (range_expression (unary_expression (literal 1)) .. (unary_expression (literal 2)))))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier g) = (expression (multiplicative_expression (multiplicative_expression (identifier e)) * (range_expression ..)))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier h) = (expression (multiplicative_expression (multiplicative_expression (identifier e)) * (range_expression (unary_expression (literal 1)) ..)))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier i) = (expression (multiplicative_expression (multiplicative_expression (identifier e)) * (range_expression .. (unary_expression (literal 2)))))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier j) = (expression (multiplicative_expression (multiplicative_expression (range_expression ..)) / (range_expression (identifier e))))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier k) = (expression (multiplicative_expression (multiplicative_expression (range_expression (unary_expression ^ (unary_expression (literal 2))) ..)) / (range_expression (identifier e))))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier l) = (expression (multiplicative_expression (multiplicative_expression (range_expression .. (unary_expression ^ (unary_expression (literal 1))))) / (range_expression (identifier e))))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier m) = (expression (multiplicative_expression (multiplicative_expression (range_expression (unary_expression ^ (unary_expression (literal 2))) .. (unary_expression ^ (unary_expression (literal 1))))) / (range_expression (identifier e))))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier n) = (expression (range_expression (unary_expression (literal 1)) .. (unary_expression (member_access (primary_expression (parenthesized_expression ( (expression (range_expression .. (unary_expression (literal 6)))) ))) . (identifier End)))))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier o) = (expression (range_expression (unary_expression (member_access (primary_expression (identifier b)) . (identifier Start))) .. (unary_expression (literal 5))))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier p) = (expression (range_expression (unary_expression (member_access (primary_expression (parenthesized_expression ( (expression (range_expression (unary_expression (literal 1)) .. (unary_expression (literal 3)))) ))) . (identifier Start))) .. (unary_expression (literal 5))))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier oops) = (expression (range_expression (unary_expression (parenthesized_expression ( (expression (range_expression (unary_expression (literal 1)) .. (unary_expression (literal 3)))) ))) .. (unary_expression (literal 5))))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier oops) = (expression (range_expression (unary_expression (literal 1)) .. (unary_expression (parenthesized_expression ( (expression (range_expression (unary_expression (literal 3)) .. (unary_expression (literal 5)))) )))))))) ;)) (statement (declaration_statement (local_variable_declaration (implicitly_typed_local_variable_declaration var (implicitly_typed_local_variable_declarator (identifier oops) = (expression (range_expression (unary_expression (literal 1)) .. (unary_expression (literal 3))))))) ..)) (statement (expression_statement statement_expression 5 ;))) })))) })))) diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.tree.svg b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.tree.svg new file mode 100644 index 000000000..85dd1add9 --- /dev/null +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/Reference/sample.tree.svg @@ -0,0 +1,2285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +expression + + + +literal + + + +implicitly_typed_local_variable_declaration + + + +/ + + + +.. + + + +declaration_statement + + + +.. + + + += + + + +statement + + + +expression + + + +literal + + + +range_expression + + + +unary_expression + + + +.. + + + +1 + + + +; + + + +implicitly_typed_local_variable_declaration + + + +implicitly_typed_local_variable_declarator + + + +var + + + +member_access + + + +multiplicative_expression + + + += + + + +identifier + + + +multiplicative_expression + + + +1 + + + +5 + + + +; + + + +unary_expression + + + +multiplicative_expression + + + +literal + + + +implicitly_typed_local_variable_declaration + + + += + + + +) + + + +e + + + +statement_expression + + + +declaration_statement + + + +identifier + + + += + + + +declaration_statement + + + +. + + + +IndexAndRangeExpressions_1 + + + +var + + + +var + + + +} + + + +c + + + +.. + + + +; + + + +range_expression + + + +identifier + + + +multiplicative_expression + + + +return_type + + + +var + + + +multiplicative_expression + + + +declaration_statement + + + +statement + + + +parenthesized_expression + + + +unary_expression + + + +identifier + + + +* + + + +2 + + + +unary_expression + + + +statement + + + +; + + + +2 + + + +5 + + + +IndexAndRangeExpressions + + + +implicitly_typed_local_variable_declarator + + + +multiplicative_expression + + + +1 + + + +range_expression + + + +literal + + + +expression + + + +e + + + +.. + + + +identifier + + + +literal + + + +implicitly_typed_local_variable_declaration + + + +literal + + + +literal + + + +; + + + +m + + + +expression + + + +; + + + +literal + + + +identifier + + + +unary_expression + + + +l + + + +unary_expression + + + += + + + +implicitly_typed_local_variable_declarator + + + +statement + + + +{ + + + +unary_expression + + + +( + + + +5 + + + +identifier + + + +g + + + +) + + + +expression + + + +local_variable_declaration + + + +unary_expression + + + +/ + + + +implicitly_typed_local_variable_declaration + + + +implicitly_typed_local_variable_declarator + + + +implicitly_typed_local_variable_declaration + + + +implicitly_typed_local_variable_declarator + + + +primary_expression + + + +identifier + + + +unary_expression + + + +expression + + + +expression + + + +var + + + +statement + + + +literal + + + +declaration_statement + + + +identifier + + + +.. + + + +unary_expression + + + += + + + +.. + + + +expression_statement + + + +range_expression + + + += + + + += + + + +.. + + + +declaration_statement + + + += + + + +( + + + +declaration_statement + + + +1 + + + +0 + + + +literal + + + +expression + + + +oops + + + +; + + + +class_member_declaration + + + +range_expression + + + +expression + + + +implicitly_typed_local_variable_declarator + + + +.. + + + +unary_expression + + + +unary_expression + + + +unary_expression + + + +2 + + + +* + + + +implicitly_typed_local_variable_declarator + + + +; + + + +local_variable_declaration + + + +range_expression + + + +expression + + + +implicitly_typed_local_variable_declaration + + + +local_variable_declaration + + + +.. + + + +identifier + + + +range_expression + + + +multiplicative_expression + + + +1 + + + +n + + + +Start + + + +method_modifiers + + + += + + + +class_declaration + + + +identifier + + + +var + + + +unary_expression + + + +Struct + + + +unary_expression + + + +; + + + +unary_expression + + + +literal + + + +; + + + +.. + + + +identifier + + + +.. + + + +identifier + + + +expression + + + +unary_expression + + + +local_variable_declaration + + + +new + + + +implicitly_typed_local_variable_declarator + + + +unary_expression + + + +unary_expression + + + +; + + + +implicitly_typed_local_variable_declarator + + + +local_variable_declaration + + + +e + + + +range_expression + + + +local_variable_declaration + + + +expression + + + +implicitly_typed_local_variable_declarator + + + +e + + + +object_creation_expression + + + +void + + + +declaration_statement + + + +statement + + + +parenthesized_expression + + + +declaration_statement + + + +method_body + + + +a + + + +implicitly_typed_local_variable_declaration + + + +class_body + + + +statement + + + +6 + + + +statement + + + +^ + + + +p + + + +e + + + +.. + + + +expression + + + +unary_expression + + + +var + + + +; + + + +local_variable_declaration + + + +.. + + + +3 + + + +implicitly_typed_local_variable_declaration + + + +e + + + +3 + + + += + + + +implicitly_typed_local_variable_declarator + + + +k + + + +; + + + +identifier + + + +expression + + + +prog + + + +e + + + +multiplicative_expression + + + +implicitly_typed_local_variable_declaration + + + +statement + + + +statement + + + +( + + + +local_variable_declaration + + + +expression + + + +parenthesized_expression + + + +o + + + +implicitly_typed_local_variable_declarator + + + +unary_expression + + + +i + + + +implicitly_typed_local_variable_declaration + + + +) + + + +literal + + + +.. + + + +literal + + + +range_expression + + + +implicitly_typed_local_variable_declarator + + + +identifier + + + +local_variable_declaration + + + +declaration_statement + + + +^ + + + +member_name + + + +implicitly_typed_local_variable_declaration + + + +identifier + + + +.. + + + +statement + + + +declaration_statement + + + +/ + + + +implicitly_typed_local_variable_declaration + + + +range_expression + + + +3 + + + +var + + + +^ + + + +range_expression + + + +implicitly_typed_local_variable_declarator + + + +identifier + + + +identifier + + + +identifier + + + +implicitly_typed_local_variable_declarator + + + +oops + + + +multiplicative_expression + + + +multiplicative_expression + + + +( + + + +local_variable_declaration + + + +range_expression + + + +var + + + += + + + +literal + + + +multiplicative_expression + + + +identifier + + + +local_variable_declaration + + + +range_expression + + + +var + + + +; + + + +; + + + +unary_expression + + + += + + + +Start + + + +local_variable_declaration + + + +local_variable_declaration + + + +class + + + +identifier + + + +literal + + + +range_expression + + + +expression + + + +var + + + +) + + + +declaration_statement + + + +range_expression + + + +e + + + +unary_expression + + + +( + + + +5 + + + +1 + + + +implicitly_typed_local_variable_declarator + + + +local_variable_declaration + + + +f + + + +range_expression + + + +identifier + + + +oops + + + +End + + + +j + + + +unary_expression + + + +; + + + +{ + + + +parenthesized_expression + + + +* + + + +; + + + +range_expression + + + +b + + + +multiplicative_expression + + + +local_variable_declaration + + + +^ + + + +unary_expression + + + +) + + + +} + + + +statement + + + +local_variable_declaration + + + +unary_expression + + + +implicitly_typed_local_variable_declarator + + + +unary_expression + + + +3 + + + +1 + + + +var + + + +unary_expression + + + +implicitly_typed_local_variable_declaration + + + +expression + + + +expression + + + +identifier + + + += + + + +multiplicative_expression + + + +unary_expression + + + +statement + + + +expression + + + += + + + +declaration_statement + + + +implicitly_typed_local_variable_declaration + + + +literal + + + +range_expression + + + +literal + + + +; + + + +d + + + +h + + + +.. + + + +method_header + + + +range_expression + + + +declaration_statement + + + +.. + + + +2 + + + +literal + + + +unary_expression + + + +.. + + + +primary_expression + + + +unary_expression + + + +expression + + + +literal + + + +implicitly_typed_local_variable_declaration + + + +multiplicative_expression + + + +statement_list + + + +. + + + +identifier + + + +identifier + + + +.. + + + +e + + + +identifier + + + +expression + + + +literal + + + +literal + + + +method_declaration + + + +range_expression + + + +statement + + + +range_expression + + + +identifier + + + +primary_expression + + + +statement + + + +.. + + + +literal + + + +* + + + +block + + + +declaration_statement + + + +^ + + + +5 + + + +unary_expression + + + +statement + + + +var + + + += + + + +range_expression + + + +identifier + + + +var + + + +implicitly_typed_local_variable_declaration + + + +implicitly_typed_local_variable_declarator + + + +identifier + + + +statement + + + +identifier + + + += + + + +var + + + +unary_expression + + + +statement + + + +identifier + + + +local_variable_declaration + + + +unary_expression + + + +1 + + + +range_expression + + + +unary_expression + + + += + + + +expression + + + +b + + + +/ + + + +literal + + + +identifier + + + +expression + + + +1 + + + +multiplicative_expression + + + +declaration_statement + + + +identifier + + + +.. + + + +literal + + + +declaration_statement + + + +var + + + +^ + + + +identifier + + + +local_variable_declaration + + + +var + + + +var + + + +multiplicative_expression + + + +implicitly_typed_local_variable_declarator + + + +compilation_unit + + + +. + + + +range_expression + + + +local_variable_declaration + + + +type + + + +declaration_statement + + + +implicitly_typed_local_variable_declaration + + + +statement + + + +; + + + += + + + +member_access + + + +) + + + +range_expression + + + +member_access + + + +var + + + +statement + + + +1 + + + +1 + + + +literal + + + +implicitly_typed_local_variable_declaration + + + +unary_expression + + + +declaration_statement + + + +( + + \ No newline at end of file diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/_Sample_Options.txt b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/_Sample_Options.txt new file mode 100644 index 000000000..c3810f510 --- /dev/null +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/_Sample_Options.txt @@ -0,0 +1 @@ +-ms Rules -rt \ No newline at end of file diff --git a/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/sample.cs b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/sample.cs new file mode 100644 index 000000000..27fabc203 --- /dev/null +++ b/tools/GrammarTesting/Tests/Parsing/Samples/v8/Index & Range/sample.cs @@ -0,0 +1,26 @@ +class IndexAndRangeExpressions +{ + void IndexAndRangeExpressions_1() + { + var a = ^1; + var b = ..^1; + var c = 0..; + var d = ..; + var e = new Struct(); // type with ops * and / taking Range + var f = e * 1 .. 2; + var g = e * ..; + var h = e * 1..; + var i = e * ..2; + var j = .. / e; + var k = ^2.. / e; + var l = .. ^1/e; + var m = ^2 ..^1 / e; + var n = 1..(.. 6).End; + var o = b.Start..5; + var p = (1..3).Start..5; + + var oops = (1..3)..5; // compile-time type error + var oops = 1..(3..5); // compile-time type error + var oops = 1..3..5; // compile-time syntax error + } +} \ No newline at end of file From f27b953456fcded7e21ed13dcec6ce9f59162448 Mon Sep 17 00:00:00 2001 From: Nigel-Ecma Date: Thu, 17 Jul 2025 14:49:22 +1200 Subject: [PATCH 2/4] =?UTF-8?q?=EF=B8=8FWell=20that=20was=20a=20bit=20emba?= =?UTF-8?q?rrassing=20:(=20Apologies.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit One always expects a few typos to get through, a “must” or two instead of “shall”, etc., but the first commit was littered with the detritus of an incrementally developed document – a very poor show, no excuses just apologies. This commit hopefully removes the distraction of the detritus making reviewing a lot easier! Thanks especially for the Herculean efforts of Rex & Jon, anything remaining is down to me of course. --- standard/arrays.md | 2 +- standard/expressions.md | 30 +++---- standard/ranges.md | 151 ++++++++++++++++++----------------- standard/standard-library.md | 6 +- 4 files changed, 97 insertions(+), 92 deletions(-) diff --git a/standard/arrays.md b/standard/arrays.md index c42b8fadd..c1e2d66ca 100644 --- a/standard/arrays.md +++ b/standard/arrays.md @@ -114,7 +114,7 @@ Elements of arrays created by *array_creation_expression*s are always initialize Array elements are accessed using the *array access* variant of *element_access* expressions ([§12.8.12.2](expressions.md#128122-array-access)) of the form `A[I₁, I₂, ..., Iₓ]`, where `A` is an expression of an array type and each `Iₑ` is an expression of type `int`, `uint`, `long`, `ulong`, or can be implicitly converted to one or more of these types. The result of an array access is a variable reference (§9.5) to the array element selected by the indices. -Array elements of single-dimensional arrays, can also be accessed using an array access expression where the sole index, `I₁`, is an expression of type `Index`, `Range`, or can be implicitly converted to one or both of these types. If `I₁` is of type `Index`, or has been implicitly converted to it, then the result of the array access is a variable reference to the array element selected by the index value. If `I₁` is of type `Range`, or has been implicitly converted to it, then the result of the element access is a new array formed from a shallow copy of the array elements with indicies in the `Range` value, maintaining the element order. +Array elements of single-dimensional arrays can also be accessed using an array access expression where the sole index, `I₁`, is an expression of type `Index`, `Range`, or can be implicitly converted to one or both of these types. If `I₁` is of type `Index`, or has been implicitly converted to it, then the result of the array access is a variable reference to the array element selected by the index value. If `I₁` is of type `Range`, or has been implicitly converted to it, then the result of the element access is a new array formed from a shallow copy of the array elements with indices in the `Range` value, maintaining the element order. The elements of an array can be enumerated using a `foreach` statement ([§13.9.5](statements.md#1395-the-foreach-statement)). diff --git a/standard/expressions.md b/standard/expressions.md index a9357b151..6df1000b7 100644 --- a/standard/expressions.md +++ b/standard/expressions.md @@ -2248,7 +2248,7 @@ The number of expressions in the *argument_list* shall be the same as the rank o - of type `int`, `uint`, `long`, or `ulong`; or - for single rank array access only of compile-time type `Index` or `Range`; or -- shall be implicitly convertible to one or more of the above types. +- be implicitly convertible to one or more of the above types. Indexing a single rank array using an expression of type `Index` or `Range` is *not* supported if the access is dynamically-bound (§12.8.12.1). @@ -2262,11 +2262,11 @@ The run-time processing of an array access of the form `P[A]`, where `P` is a *p - The value of `P` is checked to be valid. If the value of `P` is `null`, a `System.NullReferenceException` is thrown and no further steps are executed. - If the preceding steps have produced a single index value of type `Range` then: - The result of evaluating the array access is a new array. - - The starting and ending indicies of the `Range` value are determined with respect to the length of the array referenced by `P`. + - The starting and ending indices of the `Range` value are determined with respect to the length of the array referenced by `P`. - If either index is out of range of the bounds of the array referenced by `P`, or the ending index comes before the starting index, then a `System.ArgumentOutOfRangeException` is thrown and no further steps are executed. - - A new array is created from a shallow copy of the elements of `P` from the starting to ending indicies, this is commonly referred to as a *slice*. This array becomes the results of the array access. + - A new array is created from a shallow copy of the elements of `P` from the starting to ending indices, this is commonly referred to as a *slice*. This array becomes the results of the array access. -> > *Note:* A range of elements of an array cannot be assigned to using an array access. This differs from indexer accesses (§12.8.12.3) which may, but need not, support assignment to a range of indicies specified by a `Range` value. *end note* +> > *Note:* A range of elements of an array cannot be assigned to using an array access. This differs from indexer accesses (§12.8.12.3) which may, but need not, support assignment to a range of indices specified by a `Range` value. *end note* - Otherwise: - The result of evaluating the array access is a variable reference (§9.5) of the element type of the array. @@ -2275,11 +2275,11 @@ The run-time processing of an array access of the form `P[A]`, where `P` is a *p #### §string-access String access -For a string access the *argument_list* of an string access shall contain a single unnamed value argument (§15.6.2.2) which shall be of type: +For a string access the *argument_list* of an string access shall contain a single unnamed value argument (§15.6.2.2) which shall be: - of type `int`; or - of compile-time type `Index` or `Range`; or -- shall be implicitly convertible to one or more of the above types. +- implicitly convertible to one or more of the above types. Indexing a string using an expression of type `Index` or `Range` is *not* supported if the access is dynamically-bound (§12.8.12.1). @@ -2292,9 +2292,9 @@ The run-time processing of a string access of the form `P[A]`, where `P` is a *p - The value of `P` is checked to be valid. If the value of `P` is `null`, a `System.NullReferenceException` is thrown and no further steps are executed. - If the preceding steps have produced an index value of type `Range` then: - The result of evaluating the string access is a value of `string` type. - - The starting and ending indicies of the `Range` value are determined with respect to the length of the string referenced by `P`. + - The starting and ending indices of the `Range` value are determined with respect to the length of the string referenced by `P`. - If either index is out of range of the bounds of the string referenced by `P`, or the ending index comes before the starting index, then a `System.ArgumentOutOfRangeException` is thrown and no further steps are executed. - - The result of the string access is a new string formed from a shallow copy of the characters of `P` from the starting to ending indicies, this is commonly referred to as a *substring*. + - The result of the string access is a new string formed from a shallow copy of the characters of `P` from the starting to ending indices, this is commonly referred to as a *substring*. - Otherwise: - The result of evaluating the string access is a value of `char` type. - The value of the converted index expression is checked against the actual bounds of the string instance referenced by `P`. If the value is out of range, a `System.IndexOutOfRangeException` is thrown and no further steps are executed. @@ -2302,7 +2302,7 @@ The run-time processing of a string access of the form `P[A]`, where `P` is a *p #### 12.8.12.3 Indexer access -For an indexer access, the *primary_expression* of the *element_access* shall be a variable or value of a class, struct, or interface type, and this type shall implement one or more indexers that are applicable with respect to the *argument_list* of the *element_access*. The *argument_list* cannot contain `out` or `ref` arguments. +For an indexer access, the *primary_expression* of the *element_access* shall be a variable or value of a class, struct, or interface type, and this type shall implement one or more indexers that are applicable with respect to the *argument_list* of the *element_access*. The *argument_list* shall not cannot contain `out` or `ref` arguments. The binding-time processing of an indexer access of the form `P[A]`, where `P` is a *primary_expression* of a class, struct, or interface type `T`, and `A` is an *argument_list*, consists of the following steps: @@ -2313,9 +2313,9 @@ The binding-time processing of an indexer access of the form `P[A]`, where `P` i - If `I` is applicable with respect to `A` ([§12.6.4.2](expressions.md#12642-applicable-function-member)) and `S` is a class type other than `object`, all indexers declared in an interface are removed from the set. - If the resulting set of candidate indexers is empty, then no applicable indexers exist, and a binding-time error occurs. - The best indexer of the set of candidate indexers is identified using the overload resolution rules of [§12.6.4](expressions.md#1264-overload-resolution). If a single best indexer cannot be identified, the indexer access is ambiguous, and a binding-time error occurs. -- The accesors of the best indexer are checked: - - If the indexer access is the target of an assignment then the indexer must have a set or ref get accessor, if not a binding-time error occurs; - - Otherwise the indexer must have a get or ref get accesor, if not a binding-time arror occurs. +- The accessors of the best indexer are checked: + - If the indexer access is the target of an assignment then the indexer shall have a set or ref get accessor, if not a binding-time error occurs; + - Otherwise the indexer shall have a get or ref get accessor, otherwise a binding-time error occurs. The runtime processing of the indexer access consits of the following steps: @@ -2323,7 +2323,7 @@ The runtime processing of the indexer access consits of the following steps: - The index expressions of the *argument_list* `A` are evaluated in order, from left to right. - Using the best indexer determined at binding-time: - If the indexer access is the target of an assignment, the set accessor or ref get accessor is invoked to assign a new value ([§12.21.2](expressions.md#12212-simple-assignment)). - - In all other cases, the get accessor or ref get accesor is invoked to obtain the current value ([§12.2.2](expressions.md#1222-values-of-expressions)). + - In all other cases, the get accessor or ref get accessor is invoked to obtain the current value ([§12.2.2](expressions.md#1222-values-of-expressions)). The result of processing the indexer access is an expression classified as an indexer access. @@ -3662,7 +3662,7 @@ Index operator ^(int x); The hat operator is not overloadable (§12.4.3). -The result of an operation of the form `^x` is a from-end `Index` value (§24.2) equivalent to the result of the expression: +The result of an operation of the form `^x` is a from-end `Index` (§24.2) value equivalent to the result of the expression: ```csharp new Index(x, true) @@ -3827,7 +3827,7 @@ All range expressions are treated as having the form `x..y`, where: - `x` is the left operand if present, otherwise the expression `0`; and - `y` is the right operand if present, otherwise the expression `^0`. -The result of the operation is a `Range` value (§24.3) equivalent to the result of the expression: +The result of the operation is a `Range` (§24.3) value equivalent to the result of the expression: ```csharp new Range(x, y) diff --git a/standard/ranges.md b/standard/ranges.md index af9a61630..e52336389 100644 --- a/standard/ranges.md +++ b/standard/ranges.md @@ -1,12 +1,12 @@ # 24 Extended Indexing and Slicing -> **Review Note:** This new chapter, currently (§24), is placed here temporarily to avoid text changes due to renumbering occurring in chapters & clauses otherwise unaffected by the PR. It’s final placement is not yet determined, however between the Arrays ([§17](arrays.md#17-arrays)) and Interfaces ([§18](interfaces.md#18-interfaces)) chapters might be suitable – other placements can be suggested during review. It can be relocated later with just a simple edit to `clauses.json`. +> **Review Note:** This new clause, currently (§24), is placed here temporarily to avoid text changes due to renumbering occurring in chapters & clauses otherwise unaffected by the PR. Its final placement is not yet determined, however between the Arrays ([§17](arrays.md#17-arrays)) and Interfaces ([§18](interfaces.md#18-interfaces)) chapters might be suitable – other placements can be suggested during review. It can be relocated later with just a simple edit to `clauses.json`. ## 24.1 General -This chapter introduces a model for *extended indexable* and *sliceable* *collection* types built on: +This clause introduces a model for *extended indexable* and *sliceable* *collection* types built on: -- The types introduced in this chapter, `System.Index` (§24.2) and `System.Range` (§24.3); +- The types introduced in this clause, `System.Index` (§24.2) and `System.Range` (§24.3); - The pre-defined unary `^` (§hat-operator) and binary `..` (§range-operator) operators; and - The *element_access* expression. @@ -14,7 +14,7 @@ Under the model a type is classified as: - a *collection* if it represents a group of *element*s - an *extended indexable* collection if it supports an *element_access* expression which has a single argument expression of type `Index` which returns and/or sets a single element of the type, either by value or by reference; and -- an *extended sliceable* if it supports an *element_access* expression which has a single argument expression of type `Range` which returns a *slice* of the elements of the type by value. +- an *extended sliceable* collection if it supports an *element_access* expression which has a single argument expression of type `Range` which returns a *slice* of the elements of the type by value. > *Note*: The model does not require that a slice, unlike an element, of the type can be set, but a type may support it as an extension of the model. *end note* @@ -24,23 +24,21 @@ The model can be supported by any class, struct or interface type which provides Implicit support for the model is provided for types which do not directly support it but which provide a certain *pattern* of members (§24.4). This support is pattern-based, rather than semantic-based, as the semantics of the type members upon which it is based are *assumed* – the language does not enforce, or check, the semantics of these type members. -### 24.1.1 Definitions +For the purposes of this clause the following terms are defined: -For the purposes of this chapter the following terms are defined: - -- A ***collection*** is a type which represents a group of ***element***s -- A ***countable*** collection is one which provides a ***countable property*** an `int` valued instance property whose value is the number of elements currently in the group. This property must be named either `Length` or `Count`, the former is chosen if both exist. -- A ***sequence*** or ***indexable*** type is a collection: +- A ***collection*** is a type which represents a group of ***element***s. +- A ***countable collection*** is one which provides a ***countable property*** an `int` valued instance property whose value is the number of elements currently in the group. This property shall be named either `Length` or `Count`, the former is chosen if both exist. +- A ***sequence*** or ***indexable type*** is a collection: - which is countable; - where every element can be accessed using an *element_access* expression with a single required `int` argument, the ***from-start index***, additional optional arguments are allowed; - a sequence is ***modifiable*** if every element can also be set using an *element_access* expression; - an element’s from-start index is the number of elements before it in the sequence, for a sequence containing *N* elements: - - the first and last elements have indicies of 0 and *N*-1 respectively, and - - the ***past-end*** index, an index which represents a hypothetical element after the last one, has the value *N*; -- A ***from-end index*** represents an element’s position within a sequence relative to the last element. For a sequence containing *N* elements the first, last and past-end indicies are *N*, 1 and 0 respectively. -- A ***range*** is a contiguous run of zero or more indicies starting at any index within a sequence. + - the first and last elements have indices of 0 and *N*-1 respectively, and + - the ***past-end index***, an index which represents a hypothetical element after the last one, has the value *N*. +- A ***from-end index*** represents an element’s position within a sequence relative to the last element. For a sequence containing *N* elements the first, last and past-end indices are *N*, 1 and 0 respectively. +- A ***range*** is a contiguous run of zero or more indices starting at any index within a sequence. - A ***slice*** is the collection of elements within a range. -- A ***sliceable*** collection is one which: +- A ***sliceable collection*** is one which: - is countable; - provides a method `Slice` which takes two `int` parameters specifying a range, being a starting index and a count of elements respectively, and returns a new slice constructed from the elements in the range. @@ -57,7 +55,7 @@ The required members for a type to qualify as a sequence or sliceable may be inh > *Example*: In the following code > -> ```CSharp +> ```csharp > public class A > { > public int Length { get { … } } @@ -77,20 +75,22 @@ The required members for a type to qualify as a sequence or sliceable may be inh > The type `A` is countable, `B` is a sequence, and `C` is sliceable and a sequence. > > *end example* + -*Note*: - -- A type can be sliceable without being indexable due to the lack of an (accessible) indexer. -- For a type to be sliceable and/or indexable requires the type to be countable. -- While the elements of a sequence are ordered by *position* within the sequence the elements themselves need not be ordered by their value, or even orderable. - -*end note* + +> *Note*: +> +> - A type can be sliceable without being indexable due to the lack of an (accessible) indexer. +> - For a type to be sliceable and/or indexable requires the type to be countable. +> - While the elements of a sequence are ordered by *position* within the sequence the elements themselves need not be ordered by their value, or even orderable. +> +> *end note* -## 24.2 The `Index` type +## 24.2 The Index type The `System.Index` type represents an *abstract* index which is either a *from-start index* or a *from-end index*. -```CSharp +```csharp public readonly struct Index : IEquatable { public int Value { get; } @@ -104,11 +104,11 @@ The `System.Index` type represents an *abstract* index which is either a *from-s } ``` -`Index` values are constructed from an `int`, specifying the positive offset, and a `bool`, indicating whether the offset is from the end (`true`) or start (`false`). If the specified offset is negative an `ArgumentOutOfRangeException` is thrown. +`Index` values are constructed from an `int`, specifying the non-negative offset, and a `bool`, indicating whether the offset is from the end (`true`) or start (`false`). If the specified offset is negative an `ArgumentOutOfRangeException` is thrown. > *Example* > -> ```CSharp +> ```csharp > Index first = new Index(0, false); // first element index > var last = new Index(1, true); // last element index > var past = new Index(0, true); // past-end index @@ -118,13 +118,13 @@ The `System.Index` type represents an *abstract* index which is either a *from-s > > *end example* -There is an implicit conversion from `int` to `Index` which produces from-start indicies, and a language-defined unary operator `^` (§hat-operator) from `int` to `Index` which produces from-end indicies. +There is an implicit conversion from `int` to `Index` which produces from-start indices, and a language-defined unary operator `^` (§hat-operator) from `int` to `Index` which produces from-end indices. > *Example* > > Using implicit conversions and the unary `^` operator the above examples may be written: > -> ```CSharp +> ```csharp > Index first = 0; // first element index > var last = ^1; // last element index > var past = ^0; // past-end index @@ -132,9 +132,7 @@ There is an implicit conversion from `int` to `Index` which produces from-start > > *end example* -The method `GetOffset` converts from an abstract `Index` value to a concrete `int` index value for a sequence of the specified `length`. - -If the `Index` value, `I`, is from-end this method returns the same value as `length - I.Value`, otherwise it returns the same value as `I.Value`. +The method `GetOffset` converts from an abstract `Index` value to a concrete `int` index value for a sequence of the specified `length`. If the `Index` value, `I`, is from-end this method returns the same value as `length - I.Value`, otherwise it returns the same value as `I.Value`. This method does **not** check that the return value is in the valid range of `0` through `length-1` inclusive. @@ -142,22 +140,22 @@ This method does **not** check that the return value is in the valid range of `0 `Index` implements `IEquatable` and values may be compared for equality. However `Index` values are not ordered and no other comparison operations are provided. -> *Note:* `Index` values are unordered as they are abstract indicies, it is in general impossible to determine whether a from-end index comes before or after a from start index without reference to a sequence length. Once converted to concrete indicies, e.g. by `GetOffset`, those concrete indicies are comparable. *end note* +> *Note:* `Index` values are unordered as they are abstract indices, it is in general impossible to determine whether a from-end index comes before or after a from start index without reference to a sequence length. Once converted to concrete indices, e.g. by `GetOffset`, those concrete indices are comparable. *end note* `Index` values may be directly used in the *argument_list* of an *element_access* expression (§12.8.12): -- which is statically bound (§12.3.2) and: - - it is an array access and the target is a single-dimensional array (§12.8.12.2); - - it is a string access (§string-access); or - - it is an indexer access and the target type conforms to a sequence pattern for which implicit `Index` support is specified (§24.4.2). -- which is statically or dynamically bound (§12.3.2) and: - - it is an indexer access and the target type has an indexer with parameters of `Index` type (§12.8.12.3); +- which is statically bound (§12.3.2) and is: + - an array access and the target is a single-dimensional array (§12.8.12.2); + - a string access (§string-access); or + - an indexer access and the target type conforms to a sequence pattern for which implicit `Index` support is specified (§24.4.2). +- which is statically or dynamically bound (§12.3.2) and is: + - an indexer access and the target type has an indexer with parameters of `Index` type (§12.8.12.3); -## 24.3 The `Range` type +## 24.3 The Range type The `System.Range` type represents the abstract range of `Index`es from a `Start` index up to, but not including, an `End` index. -```CSharp +```csharp public readonly struct Range : IEquatable { public Index Start { get; } @@ -174,16 +172,18 @@ The `System.Range` type represents the abstract range of `Index`es from a `Start > *Example* > -> The following examples use the implicit conversion from `int` to `Index` (introduced above) and the `^` (§hat-operator) operator to create the `Index` values for each `Range`: +> The following examples use the implicit conversion from `int` to `Index` (§24.2) and the `^` (§hat-operator) operator to create the `Index` values for each `Range`: > -> ```CSharp -> var firstQuad = new Range(0, 4); // the indicies from `0` to `3` +> ```csharp +> var firstQuad = new Range(0, 4); // the indices from `0` to `3` > // int values impicitly convert to `Index` -> var nextQuad = new Range(4, 8); // the indicies from `4` to `7` -> var wholeSeq = new Range(0, ^0); // the indicies from `0` to `N-1` where `N` is the +> var nextQuad = new Range(4, 8); // the indices from `4` to `7` +> var wholeSeq = new Range(0, ^0); // the indices from `0` to `N-1` where `N` is the > // length of the sequence wholeSeq is used with -> var dropFirst = new Range(1, ^0); // the indicies from `1` to `N-1` -> var dropLast = new Range(0, ^1); // the indicies from `0` to `N-2` +> var dropFirst = new Range(1, ^0); // the indices from `1` to `N-1` +> var dropLast = new Range(0, ^1); // the indices from `0` to `N-2` +> var maybeLast = new Range(^1, 6); // the indices from `N-1` to 5 +> var lastTwo = new Range(^2, ^0); // the indices from `N-2` to `N-1` > ``` > > *end example* @@ -194,12 +194,14 @@ The language-defined operator `..` (§range-operator) creates a `Range` value fr > > Using the `..` the above examples may be written: > -> ```CSharp -> var firstQuad = 0..4; // the indicies from `0` to `3` -> var nextQuad = 4..8; // the indicies from `4` to `7` -> var wholeSeq = 0..^0; // the indicies from `0` to `N-1` -> var dropFirst = 1..^0; // the indicies from `1` to `N-1` -> var dropLast = 0..^1; // the indicies from `0` to `N-2` +> ```csharp +> var firstQuad = 0..4; // the indices from `0` to `3` +> var nextQuad = 4..8; // the indices from `4` to `7` +> var wholeSeq = 0..^0; // the indices from `0` to `N-1` +> var dropFirst = 1..^0; // the indices from `1` to `N-1` +> var dropLast = 0..^1; // the indices from `0` to `N-2` +> var maybeLast = ^1..6; // the indices from `N-1` to 5 +> var lastTwo = ^2..^0; // the indices from `N-2` to `N-1` > ``` > > *end example* @@ -208,13 +210,14 @@ The operands of `..` are optional, the first defaults to `0`, the second default > *Example* > -> Four of the above examples can also be written: +> Five of the above examples can also be written: > -> ```CSharp -> var firstQuad = ..4; // the indicies from `0` to `3` -> var wholeSeq = ..; // the indicies from `0` to `N-1` -> var dropFirst = 1..; // the indicies from `1` to `N-1` -> var dropLast = ..^1; // the indicies from `0` to `N-2` +> ```csharp +> var firstQuad = ..4; // the indices from `0` to `3` +> var wholeSeq = ..; // the indices from `0` to `N-1` +> var dropFirst = 1..; // the indices from `1` to `N-1` +> var dropLast = ..^1; // the indices from `0` to `N-2` +> var lastTwo = ^2..; // the indices from `N-2` to `N-1` > ``` > > *end example* @@ -225,29 +228,31 @@ The method `GetOffsetAndLength` converts an abstract `Range` value to a tuple va > > Using the variables defined above with `GetOffSetAndLength(6)`: > -> ```CSharp +> ```csharp > var (ix0, len0) = firstQuad.GetOffsetAndLength(6); // ix0 = 0, len0 = 4 > var (ix1, len1) = nextQuad.GetOffsetAndLength(6); // throws ArgumentOutOfRangeException > // as range crosses sequence end > var (ix2, len2) = wholeSeq.GetOffsetAndLength(6); // ix2 = 0, len2 = 6 > var (ix3, len3) = dropFirst.GetOffsetAndLength(6); // ix3 = 1, len3 = 5 > var (ix4, len4) = dropLast.GetOffsetAndLength(6); // ix4 = 0, len4 = 5 +> var (ix5, len5) = maybeLast.GetOffsetAndLength(6); // ix5 = 5, len5 = 1 +> var (ix6, len6) = lastTwo.GetOffsetAndLength(6); // ix6 = 4, len6 = 2 > ``` `Range` implements `IEquatable` and values may be compared for equality. However `Range` values are not ordered and no other comparison operations are provided. -> *Note:* `Range` values are unordered both as they are abstract and there is no unique ordering relation. Once converted to a concrete start and length, e.g. by `GetOffsetAndLength`, and ordering relation could be defined. *end note* +> *Note:* `Range` values are unordered both as they are abstract and there is no unique ordering relation. Once converted to a concrete start and length, e.g. by `GetOffsetAndLength`, an ordering relation could be defined. *end note* `Range` values can be directly used in the *argument_list* of an *element_access* expression (§12.8.12): -- which is statically bound (§12.3.2) and: - - it is an array access and the target is a single-dimensional array (§12.8.12.2); - - it is a string access (§string-access); or - - it is an indexer access (§12.8.12.3) and the target type conforms to a sequence pattern for which implicit `Range` support is specified (§24.4.3). -- which is statically or dynamically bound (§12.3.2) and: - - it is an indexer access and the target type has an indexer with parameters of `Range` type (§12.8.12.3). +- which is statically bound (§12.3.2) and is: + - an array access and the target is a single-dimensional array (§12.8.12.2); + - a string access (§string-access); or + - an indexer access (§12.8.12.3) and the target type conforms to a sequence pattern for which implicit `Range` support is specified (§24.4.3). +- which is statically or dynamically bound (§12.3.2) and is: + - an indexer access and the target type has an indexer with parameters of `Range` type (§12.8.12.3). -## 24.4 Pattern-based implicit support for `Index` and `Range` +## 24.4 Pattern-based implicit support for Index and Range ### 24.4.1 General @@ -255,16 +260,16 @@ If a statically bound (§12.3.2, §12.8.12.1) *element_access* expression (§12. - an array access (§12.8.12.2), - a string access (§string-access), or -- or and indexer access (§12.8.12.3) as `T` provides no suitable accessible indexer +- an indexer access (§12.8.12.3) as `T` provides no suitable accessible indexer then pattern-based implicit support for the expression is provided if `T` conforms to a pattern. If `T` does not conform to the pattern then a compile-time error occurs. -### 24.4.2 Implicit `Index` Support +### 24.4.2 Implicit Index support If in any context a statically bound (§12.3.2, §12.8.12.1) *element_access* expression (§12.8.12) of the form `E[A]`; where `E` has type `T` and `A` is a single expression implicitly convertible to `Index`; is not valid (§24.4.1) then if in the same context: - `T` provides accessible members qualifying it as a *sequence* (§24.1.1); and -- the expression `E[0]` is valid +- the expression `E[0]` is valid and uses the indexer qualifying `T` as a sequence then the expression `E[A]` shall be implicitly supported. @@ -275,7 +280,7 @@ Without otherwise constraining implementations of this Standard the order of eva 3. the countable property of `T` is evaluated, if required by the implementation; 4. the get or set accessor of the `int` based indexer of `T` that would be used by `E[0]` in the same context is invoked. -### 24.4.3 Implicit `Range` Support +### 24.4.3 Implicit Range support If in any context a statically bound (§12.3.2, §12.8.12.1) *element_access* expression (§12.8.12) of the form `E[A]`; where `E` has type `T` and `A` is a single expression implicitly convertible to `Range`; is not valid (§24.4.1) then if in the same context: diff --git a/standard/standard-library.md b/standard/standard-library.md index a3b1aced6..fc0dc2b44 100644 --- a/standard/standard-library.md +++ b/standard/standard-library.md @@ -416,7 +416,7 @@ namespace System /// from-start index to be used with a collection /// of some specified length. /// - Equality between Index values is provided, however - /// unlike concrete indicies they are not ordered. + /// unlike concrete indices they are not ordered. /// - Array and String element access support indexing /// with Index values. /// @@ -498,7 +498,7 @@ namespace System /// /// A read-only value type which represents a range of - /// abstract indicies to be used with collections. + /// abstract indices to be used with collections. /// - The Range has two Index properties, Start and End. /// - A Range can be converted to a concrete index from /// the start and a length value to be used with a @@ -523,7 +523,7 @@ namespace System /// of the range. /// /// As Index values represent unordered abstract - /// indicies no sanity checking can be performed + /// indices no sanity checking can be performed /// on the resultant Range value, /// ". /// From 72930dc2c8ae3db2a08707d9972ad97dfb960715 Mon Sep 17 00:00:00 2001 From: Nigel-Ecma Date: Wed, 30 Jul 2025 14:53:18 +1200 Subject: [PATCH 3/4] Fix spelling (not all down to this PR, Engish/American disagreements left untouched); other reported nits; and the numbering oops (24.1.1 -> 24.1 as header was removed) --- standard/expressions.md | 18 +++++++++--------- standard/ranges.md | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/standard/expressions.md b/standard/expressions.md index 6df1000b7..d3d500997 100644 --- a/standard/expressions.md +++ b/standard/expressions.md @@ -1732,7 +1732,7 @@ In a member access of the form `E.I`, if `E` is a single identifier, and if the A *null_conditional_member_access* is a conditional version of *member_access* ([§12.8.7](expressions.md#1287-member-access)) and it is a binding time error if the result type is `void`. For a null conditional expression where the result type may be `void` see ([§12.8.11](expressions.md#12811-null-conditional-invocation-expression)). -A *null_conditional_member_access* consists of a *primary_expression* followed by the two tokens “`?`” and “`.`”, followed by an *identifier* with an optional *type_argument_list*, followed by zero or more *dependent_access*es any of which can be preceeded by a *null_forgiving_operator*. +A *null_conditional_member_access* consists of a *primary_expression* followed by the two tokens “`?`” and “`.`”, followed by an *identifier* with an optional *type_argument_list*, followed by zero or more *dependent_access*es any of which can be preceded by a *null_forgiving_operator*. ```ANTLR null_conditional_member_access @@ -1822,7 +1822,7 @@ null_forgiving_operator ; ``` -*Note*: The postfix null-forgiving and prefix logical negation operators ([§12.9.4](expressions.md#1294-logical-negation-operator)), while represented by the same lexical token (`!`), are distinct. Only the latter may be overriden ([§15.10](classes.md#1510-operators)), the definition of the null-forgiving operator is fixed. *end note* +*Note*: The postfix null-forgiving and prefix logical negation operators ([§12.9.4](expressions.md#1294-logical-negation-operator)), while represented by the same lexical token (`!`), are distinct. Only the latter may be overridden ([§15.10](classes.md#1510-operators)), the definition of the null-forgiving operator is fixed. *end note* It is a compile-time error to apply the null-forgiving operator more than once to the same expression, intervening parentheses notwithstanding. @@ -2117,7 +2117,7 @@ The preceding rules mean that instance methods take precedence over extension me > C.H(3) > ``` > -> `D.G` takes precendece over `C.G`, and `E.F` takes precedence over both `D.F` and `C.F`. +> `D.G` takes precedence over `C.G`, and `E.F` takes precedence over both `D.F` and `C.F`. > > *end example* @@ -2156,7 +2156,7 @@ in terms of what is included the text will probably be fine but this will need t The optional *null_forgiving_operator* may be included if and only if the *null_conditional_member_access* or *null_conditional_element_access* has a *delegate_type*. -A *null_conditional_invocation_expression* expression `E` is of the form `P?A`; where `A` is the remainder of the syntactically equivalent *null_conditional_member_access* or *null_conditional_element_access*, `A` will therefore start with `.` or `[`. Let `PA` signify the concatention of `P` and `A`. +A *null_conditional_invocation_expression* expression `E` is of the form `P?A`; where `A` is the remainder of the syntactically equivalent *null_conditional_member_access* or *null_conditional_element_access*, `A` will therefore start with `.` or `[`. Let `PA` signify the concatenation of `P` and `A`. When `E` occurs as a *statement_expression* the meaning of `E` is the same as the meaning of the *statement*: @@ -2275,7 +2275,7 @@ The run-time processing of an array access of the form `P[A]`, where `P` is a *p #### §string-access String access -For a string access the *argument_list* of an string access shall contain a single unnamed value argument (§15.6.2.2) which shall be: +For a string access the *argument_list* of the *element_access* shall contain a single unnamed value argument (§15.6.2.2) which shall be: - of type `int`; or - of compile-time type `Index` or `Range`; or @@ -2317,7 +2317,7 @@ The binding-time processing of an indexer access of the form `P[A]`, where `P` i - If the indexer access is the target of an assignment then the indexer shall have a set or ref get accessor, if not a binding-time error occurs; - Otherwise the indexer shall have a get or ref get accessor, otherwise a binding-time error occurs. -The runtime processing of the indexer access consits of the following steps: +The runtime processing of the indexer access consists of the following steps: - The target *primary_expression* `P` is evaluated. - The index expressions of the *argument_list* `A` are evaluated in order, from left to right. @@ -4707,7 +4707,7 @@ User defined conversions are not considered by the `is` operator. > - If the compile-time type of `e` is the same as `T`, or if an implicit reference conversion ([§10.2.8](conversions.md#1028-implicit-reference-conversions)), boxing conversion ([§10.2.9](conversions.md#1029-boxing-conversions)), wrapping conversion ([§10.6](conversions.md#106-conversions-involving-nullable-types)), or an explicit unwrapping conversion ([§10.6](conversions.md#106-conversions-involving-nullable-types)) exists from the compile-time type of `E` to `T`: > - If `C` is of a non-nullable value type, the result of the operation is `true`. > - Otherwise, the result of the operation is equivalent to evaluating `E != null`. -> - Otherwise, if an explicit reference conversion ([§10.3.5](conversions.md#1035-explicit-reference-conversions)) or unboxing conversion ([§10.3.7](conversions.md#1037-unboxing-conversions)) exists from `C` to `T`, or if `C` or `T` is an open type ([§8.4.3](types.md#843-open-and-closed-types)), then runtime checks as above shall be peformed. +> - Otherwise, if an explicit reference conversion ([§10.3.5](conversions.md#1035-explicit-reference-conversions)) or unboxing conversion ([§10.3.7](conversions.md#1037-unboxing-conversions)) exists from `C` to `T`, or if `C` or `T` is an open type ([§8.4.3](types.md#843-open-and-closed-types)), then runtime checks as above shall be performed. > - Otherwise, no reference, boxing, wrapping, or unwrapping conversion of `E` to type `T` is possible, and the result of the operation is `false`. > A compiler may implement optimisations based on the compile-time type. > @@ -5451,7 +5451,7 @@ A local variable is considered to be ***instantiated*** when execution enters th > > *end example* -When not captured, there is no way to observe exactly how often a local variable is instantiated—because the lifetimes of the instantiations are disjoint, it is possible for each instantation to simply use the same storage location. However, when an anonymous function captures a local variable, the effects of instantiation become apparent. +When not captured, there is no way to observe exactly how often a local variable is instantiated—because the lifetimes of the instantiations are disjoint, it is possible for each instantiation to simply use the same storage location. However, when an anonymous function captures a local variable, the effects of instantiation become apparent. > *Example*: The example > @@ -6549,7 +6549,7 @@ In the translation steps described above, transparent identifiers are always int The ***Query-expression pattern*** establishes a pattern of methods that types can implement to support query expressions. -A generic type `C` supports the query-expression-pattern if its public member methods and the publicly accessible extension methods could be replaced by the following class definition. The members and accessible extenson methods is referred to as the “shape” of a generic type `C`. A generic type is used in order to illustrate the proper relationships between parameter and return types, but it is possible to implement the pattern for non-generic types as well. +A generic type `C` supports the query-expression-pattern if its public member methods and the publicly accessible extension methods could be replaced by the following class definition. The members and accessible extension methods is referred to as the “shape” of a generic type `C`. A generic type is used in order to illustrate the proper relationships between parameter and return types, but it is possible to implement the pattern for non-generic types as well. ```csharp diff --git a/standard/ranges.md b/standard/ranges.md index e52336389..2a31e19e1 100644 --- a/standard/ranges.md +++ b/standard/ranges.md @@ -192,7 +192,7 @@ The language-defined operator `..` (§range-operator) creates a `Range` value fr > *Example* > -> Using the `..` the above examples may be written: +> Using the `..` operator the above examples may be written: > > ```csharp > var firstQuad = 0..4; // the indices from `0` to `3` @@ -268,7 +268,7 @@ then pattern-based implicit support for the expression is provided if `T` confor If in any context a statically bound (§12.3.2, §12.8.12.1) *element_access* expression (§12.8.12) of the form `E[A]`; where `E` has type `T` and `A` is a single expression implicitly convertible to `Index`; is not valid (§24.4.1) then if in the same context: -- `T` provides accessible members qualifying it as a *sequence* (§24.1.1); and +- `T` provides accessible members qualifying it as a *sequence* (§24.1); and - the expression `E[0]` is valid and uses the indexer qualifying `T` as a sequence then the expression `E[A]` shall be implicitly supported. @@ -284,7 +284,7 @@ Without otherwise constraining implementations of this Standard the order of eva If in any context a statically bound (§12.3.2, §12.8.12.1) *element_access* expression (§12.8.12) of the form `E[A]`; where `E` has type `T` and `A` is a single expression implicitly convertible to `Range`; is not valid (§24.4.1) then if in the same context: -- `T` provides accessible members qualifying it as both *countable* and *sliceable* (§24.1.1) +- `T` provides accessible members qualifying it as both *countable* and *sliceable* (§24.1) then the expression `E[A]` shall be implicitly supported. From fb1675f4eea9824a0cdd16a287a541054f8b6a1b Mon Sep 17 00:00:00 2001 From: Nigel-Ecma Date: Fri, 8 Aug 2025 15:07:04 +1200 Subject: [PATCH 4/4] Updates: - Description of the semantics of `Range` expanded in ranges.md and uses in expressions.md xref to there for the semantics - All references to certain introduced features not being available in dynamic bound code elided. - Various wording tweaks. --- standard/arrays.md | 2 +- standard/expressions.md | 49 +++++++++++++++++----------------- standard/ranges.md | 59 +++++++++++++++++++++++++---------------- 3 files changed, 61 insertions(+), 49 deletions(-) diff --git a/standard/arrays.md b/standard/arrays.md index c1e2d66ca..1fda69889 100644 --- a/standard/arrays.md +++ b/standard/arrays.md @@ -114,7 +114,7 @@ Elements of arrays created by *array_creation_expression*s are always initialize Array elements are accessed using the *array access* variant of *element_access* expressions ([§12.8.12.2](expressions.md#128122-array-access)) of the form `A[I₁, I₂, ..., Iₓ]`, where `A` is an expression of an array type and each `Iₑ` is an expression of type `int`, `uint`, `long`, `ulong`, or can be implicitly converted to one or more of these types. The result of an array access is a variable reference (§9.5) to the array element selected by the indices. -Array elements of single-dimensional arrays can also be accessed using an array access expression where the sole index, `I₁`, is an expression of type `Index`, `Range`, or can be implicitly converted to one or both of these types. If `I₁` is of type `Index`, or has been implicitly converted to it, then the result of the array access is a variable reference to the array element selected by the index value. If `I₁` is of type `Range`, or has been implicitly converted to it, then the result of the element access is a new array formed from a shallow copy of the array elements with indices in the `Range` value, maintaining the element order. +Array elements of single-dimensional arrays can also be accessed using an array access expression where the sole index, `I₁`, is an expression of type `Index`, `Range`, or can be implicitly converted to one or both of these types. If `I₁` is of type `Index`, or has been implicitly converted to it, then the result of the array access is a variable reference to the array element selected by the index value. If `I₁` is of type `Range`, or has been implicitly converted to it, then the result of the element access is a new array formed from a shallow copy of the array elements with indices in the `Range`, maintaining the element order. The elements of an array can be enumerated using a `foreach` statement ([§13.9.5](statements.md#1395-the-foreach-statement)). diff --git a/standard/expressions.md b/standard/expressions.md index d3d500997..6a62a93e5 100644 --- a/standard/expressions.md +++ b/standard/expressions.md @@ -172,8 +172,8 @@ When an operand occurs between two operators with the same precedence, the ***as > *Example*: `x + y + z` is evaluated as `(x + y) + z`. *end example* - The assignment operators, the null coalescing operator and the conditional operator (`?:`) are ***right-associative***, meaning that operations are performed from right to left. > *Example*: `x = y = z` is evaluated as `x = (y = z)`. *end example* -- The range operator is ***non-associative***. - > *Example*: `x..y..z` is invalid. *end example* +- The range operator is ***non-associative***, meaning that neither the left nor right operand of a range operator may be a *range_expression*. + > *Example*: Both `x..y..z` and `x..(y..z)` are invalid as `..` is non-associative. *end example* Precedence and associativity can be controlled using parentheses. @@ -2247,26 +2247,28 @@ For an array access the *argument_list* shall not contain named arguments or by- The number of expressions in the *argument_list* shall be the same as the rank of the *array_type*, and each expression shall be: - of type `int`, `uint`, `long`, or `ulong`; or -- for single rank array access only of compile-time type `Index` or `Range`; or +- for single rank array access only, of type `Index` or `Range`; or - be implicitly convertible to one or more of the above types. -Indexing a single rank array using an expression of type `Index` or `Range` is *not* supported if the access is dynamically-bound (§12.8.12.1). - The run-time processing of an array access of the form `P[A]`, where `P` is a *primary_expression* of an *array_type* and `A` is an *argument_list* of index expressions, consists of the following steps: - `P` is evaluated. If this evaluation causes an exception, no further steps are executed. - For each index expression in the *argument_list* in order, from left to right: - The index expression is evaluated, let the type of the resultant value be *T*; - - This value is then converted to the first of the types: `int`, `uint`, `long`, `ulong`, or for static bound single rank array access only `Index` or `Range`; for which an implicit conversion ([§10.2](conversions.md#102-implicit-conversions)) from *T* exists. + - This value is then converted to the first of the types: `int`, `uint`, `long`, `ulong`, or for single rank array access only, `Index` or `Range`; for which an implicit conversion ([§10.2](conversions.md#102-implicit-conversions)) from *T* exists. - If evaluation of an index expression or the subsequent implicit conversion causes an exception, then no further index expressions are evaluated and no further steps are executed. - The value of `P` is checked to be valid. If the value of `P` is `null`, a `System.NullReferenceException` is thrown and no further steps are executed. - If the preceding steps have produced a single index value of type `Range` then: - - The result of evaluating the array access is a new array. - - The starting and ending indices of the `Range` value are determined with respect to the length of the array referenced by `P`. - - If either index is out of range of the bounds of the array referenced by `P`, or the ending index comes before the starting index, then a `System.ArgumentOutOfRangeException` is thrown and no further steps are executed. - - A new array is created from a shallow copy of the elements of `P` from the starting to ending indices, this is commonly referred to as a *slice*. This array becomes the results of the array access. + - Let *L* be the length of the array referenced by `P`. + - `A` is checked to be valid with respect to *L* (§24.3), if it is not then a `System.ArgumentOutOfRangeException` is thrown and no further steps are executed. + - The starting offset, *S*, and number of items, *N*, for `A` with respect to *L* are determined as described for `GetOffsetAndLength` (§24.3). + - A new array is created from a shallow copy of the *N* elements of `P` starting at index *S*, if *N* is zero the new array has zero elements. This array becomes the result of the array access. -> > *Note:* A range of elements of an array cannot be assigned to using an array access. This differs from indexer accesses (§12.8.12.3) which may, but need not, support assignment to a range of indices specified by a `Range` value. *end note* +> > > *Note:* Both *S* and *N* may be zero ($24.3). Indexing an empty array is usually invalid, however indexing with an empty range starting at zero is valid and returns an empty array. The defintion also allows *S* to be *L*, the past-end index (§24.1), in which case *N* will be zero and an empty array returned. *end note* + + + +> > > *Note:* A range of elements of an array cannot be assigned to using an array access. This differs from indexer accesses (§12.8.12.3) which may, but need not, support assignment to a range of indices specified by a `Range` value. *end note* - Otherwise: - The result of evaluating the array access is a variable reference (§9.5) of the element type of the array. @@ -2277,24 +2279,25 @@ The run-time processing of an array access of the form `P[A]`, where `P` is a *p For a string access the *argument_list* of the *element_access* shall contain a single unnamed value argument (§15.6.2.2) which shall be: -- of type `int`; or -- of compile-time type `Index` or `Range`; or +- of type `int`, `Index` or `Range`; or - implicitly convertible to one or more of the above types. -Indexing a string using an expression of type `Index` or `Range` is *not* supported if the access is dynamically-bound (§12.8.12.1). - The run-time processing of a string access of the form `P[A]`, where `P` is a *primary_expression* of `string` type and `A` is a single expression, consists of the following steps: - `P` is evaluated. If this evaluation causes an exception, no further steps are executed. - The index expression is evaluated, let the type of the resultant value be *T*; -- This value is then converted to the first of the types: `int`, or for static bound expressions only `Index` or `Range`; for which an implicit conversion ([§10.2](conversions.md#102-implicit-conversions)) from *T* exists. +- This value is then converted to the first of the types: `int`, `Index` or `Range`; for which an implicit conversion ([§10.2](conversions.md#102-implicit-conversions)) from *T* exists. - If evaluation of an index expression or the subsequent implicit conversion causes an exception, then no further index expressions are evaluated and no further steps are executed. - The value of `P` is checked to be valid. If the value of `P` is `null`, a `System.NullReferenceException` is thrown and no further steps are executed. - If the preceding steps have produced an index value of type `Range` then: - The result of evaluating the string access is a value of `string` type. - - The starting and ending indices of the `Range` value are determined with respect to the length of the string referenced by `P`. - - If either index is out of range of the bounds of the string referenced by `P`, or the ending index comes before the starting index, then a `System.ArgumentOutOfRangeException` is thrown and no further steps are executed. - - The result of the string access is a new string formed from a shallow copy of the characters of `P` from the starting to ending indices, this is commonly referred to as a *substring*. + - Let *L* be the length of the string referenced by `P`. + - `A` is checked to be valid with respect to *L* (§24.3), if it is not then a `System.ArgumentOutOfRangeException` is thrown and no further steps are executed. + - The starting offset, *S*, and number of items, *N*, for `A` with respect to *L* are determined as described for `GetOffsetAndLength` (§24.3). + - The result of the string access is a new string formed by copying the *N* characters of `P` starting from *S*, if *N* is zero the new string is empty. + +> > > *Note:* Both *S* and *N* may be zero (§24.3). Indexing an empty string is usually invalid, however indexing with an empty range starting at zero is valid and returns an empty string. The defintion also allows *S* to be *L*, the past-end index (§24.1), in which case *N* will be zero and an empty string returned. *end note* + - Otherwise: - The result of evaluating the string access is a value of `char` type. - The value of the converted index expression is checked against the actual bounds of the string instance referenced by `P`. If the value is out of range, a `System.IndexOutOfRangeException` is thrown and no further steps are executed. @@ -2325,8 +2328,6 @@ The runtime processing of the indexer access consists of the following steps: - If the indexer access is the target of an assignment, the set accessor or ref get accessor is invoked to assign a new value ([§12.21.2](expressions.md#12212-simple-assignment)). - In all other cases, the get accessor or ref get accessor is invoked to obtain the current value ([§12.2.2](expressions.md#1222-values-of-expressions)). -The result of processing the indexer access is an expression classified as an indexer access. - ### 12.8.13 Null Conditional Element Access A *null_conditional_element_access* consists of a *primary_expression* followed by the two tokens “`?`” and “`[`”, followed by an *argument_list*, followed by a “`]`” token, followed by zero or more *dependent_access*es any of which can be preceded by a *null_forgiving_operator*. @@ -3652,16 +3653,14 @@ The result of evaluating `~x`, where `X` is an expression of an enumeration ty Lifted ([§12.4.8](expressions.md#1248-lifted-operators)) forms of the unlifted predefined bitwise complement operators defined above are also predefined. -### §hat-operator Hat/index from-end operator +### §hat-operator Hat operator -The unary `^` operator is called the *hat* (or *index from-end*) operator. The predefined hat operator is: +The unary `^` operator is called the *hat* operator. The hat operator is not overloadable (§12.4.3) and there is a single predefined hat operator: ```csharp Index operator ^(int x); ``` -The hat operator is not overloadable (§12.4.3). - The result of an operation of the form `^x` is a from-end `Index` (§24.2) value equivalent to the result of the expression: ```csharp diff --git a/standard/ranges.md b/standard/ranges.md index 2a31e19e1..538852b9f 100644 --- a/standard/ranges.md +++ b/standard/ranges.md @@ -138,18 +138,16 @@ This method does **not** check that the return value is in the valid range of `0 > *Note:* No checking is specified as the expected use of the result is to index into a sequence with `length` elements, and that indexing operation is expected to perform the appropriate checks. *end note* -`Index` implements `IEquatable` and values may be compared for equality. However `Index` values are not ordered and no other comparison operations are provided. +`Index` implements `IEquatable` and values may be compared for equality based on the abstract value; two `Index` values are equal if and only if the respective `Value` and `IsFromEnd` properties are equal. However `Index` values are not ordered and no other comparison operations are provided. > *Note:* `Index` values are unordered as they are abstract indices, it is in general impossible to determine whether a from-end index comes before or after a from start index without reference to a sequence length. Once converted to concrete indices, e.g. by `GetOffset`, those concrete indices are comparable. *end note* -`Index` values may be directly used in the *argument_list* of an *element_access* expression (§12.8.12): +`Index` values may be directly used in the *argument_list* of an *element_access* expression (§12.8.12) which is: -- which is statically bound (§12.3.2) and is: - - an array access and the target is a single-dimensional array (§12.8.12.2); - - a string access (§string-access); or - - an indexer access and the target type conforms to a sequence pattern for which implicit `Index` support is specified (§24.4.2). -- which is statically or dynamically bound (§12.3.2) and is: - - an indexer access and the target type has an indexer with parameters of `Index` type (§12.8.12.3); +- an array access and the target is a single-dimensional array (§12.8.12.2); +- a string access (§string-access) +- an indexer access and the target type has an indexer with corresponding parameters of either `Index` type (§12.8.12.3) or of a type to which `Index` values are implicitly convertible; or +- an indexer access and the target type conforms to a sequence pattern for which implicit `Index` support is specified (§24.4.2). ## 24.3 The Range type @@ -210,7 +208,7 @@ The operands of `..` are optional, the first defaults to `0`, the second default > *Example* > -> Five of the above examples can also be written: +> Five of the above examples can be shortened by relying on default values for operands: > > ```csharp > var firstQuad = ..4; // the indices from `0` to `3` @@ -222,8 +220,25 @@ The operands of `..` are optional, the first defaults to `0`, the second default > > *end example* -The method `GetOffsetAndLength` converts an abstract `Range` value to a tuple value consisting of a concrete `int` index and a number of elements, applicable to a sequence with `length` elements. If the `Range` value is invalid with respect to sequence with `length` elements this method throws `ArgumentOutOfRangeException`. +A `Range` value is *valid* with respect to a length *L* if: +- the concrete indices with respect to *L* of the `Range` properties `Start` and `End` are in the range 0 to *L*; and +- the concrete index for `Start` is not greater than the concrete index for `End` + +The method `GetOffsetAndLength` with an argument `length` converts an abstract `Range` value to a concrete `Range` value represented by tuple. If the `Range` is not valid with respect to `length` the method throws `ArgumentOutOfRangeException`. + +The returned concrete `Range` tuple is a pair of the form `(S, N)` where: + +- `S` is the starting offset of the range, being the concrete index for the `Start` property of the `Range`; and +- `N` is the number of items in the range, being the difference between the concrete indices for the `End` and `Start` properties; +- both values being calculated with respect to `length`. + +A concrete range value is *empty* if `N` is zero. An empty concrete range may have an `S` value equal to concrete past-end index (§24.1), a non-empty range may not. When a `Range` which is used to slice (§24.1) a collection is valid and empty with respect to that collection then the resulting slice is an empty collection. + +> *Note:* A consequence of the above is that a `Range` value which is valid and empty with respect to a `length` of zero may be used to slice an empty collection and results in an empty slice. This differs from indexing which throws an exception if the collection is empty. *end note** + + + > *Example* > > Using the variables defined above with `GetOffSetAndLength(6)`: @@ -239,37 +254,35 @@ The method `GetOffsetAndLength` converts an abstract `Range` value to a tuple va > var (ix6, len6) = lastTwo.GetOffsetAndLength(6); // ix6 = 4, len6 = 2 > ``` -`Range` implements `IEquatable` and values may be compared for equality. However `Range` values are not ordered and no other comparison operations are provided. +`Range` implements `IEquatable` and values may be compared for equality based on the abstract value; two `Range` values are equal if and only if the abstract values of the respective `Start` and `End` properties are equal (§24.2). However `Range` values are not ordered and no other comparison operations are provided. > *Note:* `Range` values are unordered both as they are abstract and there is no unique ordering relation. Once converted to a concrete start and length, e.g. by `GetOffsetAndLength`, an ordering relation could be defined. *end note* -`Range` values can be directly used in the *argument_list* of an *element_access* expression (§12.8.12): +`Range` values can be directly used in the *argument_list* of an *element_access* expression (§12.8.12) which is: -- which is statically bound (§12.3.2) and is: - - an array access and the target is a single-dimensional array (§12.8.12.2); - - a string access (§string-access); or - - an indexer access (§12.8.12.3) and the target type conforms to a sequence pattern for which implicit `Range` support is specified (§24.4.3). -- which is statically or dynamically bound (§12.3.2) and is: - - an indexer access and the target type has an indexer with parameters of `Range` type (§12.8.12.3). +- an array access and the target is a single-dimensional array (§12.8.12.2); +- a string access (§string-access); +- an indexer access and the target type has an indexer with corresponding parameters of either `Range` type (§12.8.12.3) or of a type to which `Range` values are implicitly convertible; or +- an indexer access (§12.8.12.3) and the target type conforms to a sequence pattern for which implicit `Range` support is specified (§24.4.3). ## 24.4 Pattern-based implicit support for Index and Range ### 24.4.1 General -If a statically bound (§12.3.2, §12.8.12.1) *element_access* expression (§12.8.12) of the form `E[A]`; where `E` has type `T` and `A` is a single expression implicitly convertible at compile-time to `Index` or `Range`; fails to be identified as: +If an *element_access* expression (§12.8.12) of the form `E[A]`; where `E` has type `T` and `A` is a single expression implicitly convertible to `Index` or `Range`; fails to be identified as: - an array access (§12.8.12.2), - a string access (§string-access), or - an indexer access (§12.8.12.3) as `T` provides no suitable accessible indexer -then pattern-based implicit support for the expression is provided if `T` conforms to a pattern. If `T` does not conform to the pattern then a compile-time error occurs. +then implicit support for the expression is provided if `T` conforms to a particular pattern. If `T` does not conform to this pattern then a compile-time error occurs. ### 24.4.2 Implicit Index support -If in any context a statically bound (§12.3.2, §12.8.12.1) *element_access* expression (§12.8.12) of the form `E[A]`; where `E` has type `T` and `A` is a single expression implicitly convertible to `Index`; is not valid (§24.4.1) then if in the same context: +If in any context an *element_access* expression (§12.8.12) of the form `E[A]`; where `E` has type `T` and `A` is a single expression implicitly convertible to `Index`; is not valid (§24.4.1) then if in the same context: - `T` provides accessible members qualifying it as a *sequence* (§24.1); and -- the expression `E[0]` is valid and uses the indexer qualifying `T` as a sequence +- the expression `E[0]` is valid and uses the same indexer that qualifies `T` as a sequence then the expression `E[A]` shall be implicitly supported. @@ -282,7 +295,7 @@ Without otherwise constraining implementations of this Standard the order of eva ### 24.4.3 Implicit Range support -If in any context a statically bound (§12.3.2, §12.8.12.1) *element_access* expression (§12.8.12) of the form `E[A]`; where `E` has type `T` and `A` is a single expression implicitly convertible to `Range`; is not valid (§24.4.1) then if in the same context: +If in any context an *element_access* expression (§12.8.12) of the form `E[A]`; where `E` has type `T` and `A` is a single expression implicitly convertible to `Range`; is not valid (§24.4.1) then if in the same context: - `T` provides accessible members qualifying it as both *countable* and *sliceable* (§24.1)