kwlabel = 'label';
kwwith = 'with';
kwdebug = '__debug__';
+kwyield = 'yield';
opar = '(';
cpar = ')';
= {vardecl} vardecl {-> vardecl.expr}
| {assign} assignment~nopar {-> assignment~nopar.expr}
| {return} kwreturn expr? {-> New expr.return(kwreturn, expr)}
+ | {yield} kwyield expr {-> New expr.yield(kwyield, expr)}
| {break} kwbreak label? {-> New expr.break(kwbreak, label)}
| {abort} kwabort {-> New expr.abort(kwabort)}
| {continue} kwcontinue label? {-> New expr.continue(kwcontinue, label)}
expr = {block} expr* kwend?
| {vardecl} kwvar? id type? assign? expr? annotations?
| {return} kwreturn? expr?
+ | {yield} kwyield expr
| {break} kwbreak label?
| {abort} kwabort
| {continue} kwcontinue? label?
super TokenKeyword
end
+# The keyword `yield`
+class TKwyield
+ super TokenKeyword
+end
+
# The special keyword `__DEBUG__`
class TKwdebug
super Token
var n_expr: nullable AExpr = null is writable
end
+# A `yield` statement. eg `yield x`
+class AYieldExpr
+ super AExpr
+
+ # The `yield` keyword
+ var n_kwyield: nullable TKwyield = null is writable
+
+ # The return value, if any
+ var n_expr: nullable AExpr = null is writable
+end
+
# Something that has a label.
abstract class ALabelable
super Prod