Previously, the way repeat rules were expanded, the auxiliary rule always needed to be reduced, even if the repeating content was empty. This caused problems in parse states where some items contained the repeat rule and some did not. To make those cases work, the repeat rule had to explicitly be marked as optional. With this change, that is no longer necessary.
142 lines
4 KiB
Text
142 lines
4 KiB
Text
==========================================
|
|
parses function calls
|
|
==========================================
|
|
x.theMethod(5, 6);
|
|
---
|
|
(expression_statement (function_call
|
|
(property_access (identifier) (identifier))
|
|
(number) (number)))
|
|
|
|
==========================================
|
|
parses constructor calls
|
|
==========================================
|
|
var x = new Node(5, new Node(3, null));
|
|
---
|
|
(var_declaration
|
|
(identifier)
|
|
(constructor_call (function_call (identifier)
|
|
(number)
|
|
(constructor_call (function_call (identifier)
|
|
(number)
|
|
(null))))))
|
|
|
|
==========================================
|
|
parses property access with dot notation
|
|
==========================================
|
|
object.property = "the-value";
|
|
print(object.property);
|
|
---
|
|
(program
|
|
(expression_statement (assignment
|
|
(property_access (identifier) (identifier))
|
|
(string)))
|
|
(expression_statement (function_call
|
|
(identifier)
|
|
(property_access (identifier) (identifier)))))
|
|
|
|
==========================================
|
|
parses property access across lines
|
|
==========================================
|
|
object
|
|
.someProperty
|
|
.otherProperty
|
|
---
|
|
(expression_statement
|
|
(property_access
|
|
(property_access (identifier) (identifier))
|
|
(identifier)))
|
|
|
|
===========================================
|
|
parses dynamic property access
|
|
==========================================
|
|
object[propertName()] = propertyValue();
|
|
print(object[propertyName()]);
|
|
---
|
|
(program
|
|
(expression_statement (assignment
|
|
(property_access (identifier) (function_call (identifier)))
|
|
(function_call (identifier))))
|
|
(expression_statement (function_call
|
|
(identifier)
|
|
(property_access (identifier) (function_call (identifier))))))
|
|
|
|
==========================================
|
|
parses ternary expressions
|
|
==========================================
|
|
print(isDone() ? stuff : otherStuff);
|
|
---
|
|
(expression_statement
|
|
(function_call
|
|
(identifier)
|
|
(ternary (function_call (identifier)) (identifier) (identifier))))
|
|
|
|
==========================================
|
|
parses mathematical operators
|
|
==========================================
|
|
-a + b * c - d / +e
|
|
|
|
---
|
|
(expression_statement
|
|
(math_op
|
|
(math_op (identifier))
|
|
(math_op
|
|
(math_op (identifier) (identifier))
|
|
(math_op (identifier) (math_op (identifier))))))
|
|
|
|
==========================================
|
|
parses boolean operators
|
|
=========================================
|
|
!a || !(b && c)
|
|
|
|
---
|
|
(expression_statement
|
|
(bool_op
|
|
(bool_op (identifier))
|
|
(bool_op
|
|
(expression (bool_op (identifier) (identifier))))))
|
|
|
|
===========================================
|
|
parses the type operators
|
|
===========================================
|
|
print((x instanceof Array) || (typeof x == "string"))
|
|
|
|
---
|
|
(expression_statement (function_call (identifier)
|
|
(bool_op
|
|
(expression (instanceof_expression (identifier) (identifier)))
|
|
(expression (typeof_expression (bool_op (identifier) (string)))))))
|
|
|
|
============================================
|
|
parses the 'in' operator
|
|
===========================================
|
|
print(x in y)
|
|
|
|
---
|
|
(expression_statement (function_call
|
|
(identifier)
|
|
(in_expression (identifier) (identifier))))
|
|
|
|
============================================
|
|
parses assignment operators
|
|
============================================
|
|
x += 1;
|
|
x -= 1;
|
|
x *= 2;
|
|
x /= 2;
|
|
---
|
|
(program
|
|
(expression_statement (assignment (identifier) (number)))
|
|
(expression_statement (assignment (identifier) (number)))
|
|
(expression_statement (assignment (identifier) (number)))
|
|
(expression_statement (assignment (identifier) (number))))
|
|
|
|
============================================
|
|
parses property access and operators
|
|
============================================
|
|
print(x.y.z && a.b.c)
|
|
|
|
---
|
|
(expression_statement (function_call (identifier)
|
|
(bool_op
|
|
(property_access (property_access (identifier) (identifier)) (identifier))
|
|
(property_access (property_access (identifier) (identifier)) (identifier)))))
|