| I assume you ment to write `assert(subexpression != undefined)`? This is resilient parsing --- we are parsing source code with syntax errors, but still want to produce a best-effort syntax tree. Although expression is required by the grammar, the `expression` function might still return nothing if the user typed some garbage there instead of a valid expression. However, even if we return nothing due to garbage, there are two possible behaviors: * We can consume no tokens, making a guess that what looks like "garbage" from the perspective of expression parser is actually a start of next larger syntax construct: ```
function f() {
let x = foo(1,
let not_garbage = 92;
}
``` In this example, it would be smart to _not_ consume `let` when parsing `foo(`'s arglist. * Alternatively, we can consume some tokens, guessing that the user _meant_ to write an expression there ```
function f() {
let x = foo(1, /);
}
``` In the above example, it would be smart to skip over `/`. |