Expressions that syntactically contain an “exterior” struct literal, i.e., not surrounded by any
parens or other delimiters, e.g., X { y: 1 }
, X { y: 1 }.method()
, foo == X { y: 1 }
and
X { y: 1 } == foo
all do, but (X { y: 1 }) == foo
does not.
Does this expression require a semicolon to be treated
as a statement? The negation of this: ‘can this expression
be used as a statement without a semicolon’ – is used
as an early-bail-out in the parser so that, for instance,
if true {…} else {…}
|x| 5
isn’t parsed as (if true {…} else {…} | x) | 5
Requires you to pass an input filename and reader so that
it can scan the input text for comments to copy forward.
This statement requires a semicolon after it.
note that in one case (stmt_semi), we’ve already
seen the semicolon, and thus don’t need another.