gg = '>>';
starship = '<=>';
bang='!';
+quest='?';
at='@';
semi=';';
recv~nopar~nobra {-> expr}
= expr_atom~nopar~nobra dot no {-> expr_atom~nopar~nobra.expr}
+ | {safe} expr_atom~nopar~nobra quest dot no {-> New expr.safe(expr_atom~nopar~nobra.expr, quest)}
| {implicit} {-> New expr.implicit_self()}
;
| {debug_type} kwdebug kwtype expr type
| {vararg} expr dotdotdot
| {namedarg} id assign expr
+ | {safe} expr quest
| {type} type
| {methid} expr [id]:methid
| {at} annotations
class TBang
super Token
end
+class TQuest
+ super Token
+end
class TAt
super Token
end
var n_assign: TAssign is writable, noinit
var n_expr: AExpr is writable, noinit
end
+class ASafeExpr
+ super AExpr
+ var n_expr: AExpr is writable, noinit
+ var n_quest: TQuest is writable, noinit
+end
class ATypeExpr
super AExpr
var n_type: AType is writable, noinit
super TokenOperator
end
+# The operator `?`
+class TQuest
+ super TokenOperator
+end
+
# The operator `!`
class TBang
super TokenOperator
var n_dotdotdot: TDotdotdot is writable, noinit
end
+# A receiver with a `?` suffix used in safe call operator.
+class ASafeExpr
+ super AExpr
+
+ # The expression made safe
+ var n_expr: AExpr is writable, noinit
+
+ # The `?` symbol
+ var n_quest: TQuest is writable, noinit
+end
+
# An named notation used to pass an expression by name in a parameter
class ANamedargExpr
super AExpr