From: Jean Privat Date: Wed, 10 Jul 2019 13:54:14 +0000 (-0400) Subject: syntax: add safe call syntax `x?.foo` X-Git-Url: http://nitlanguage.org syntax: add safe call syntax `x?.foo` Signed-off-by: Jean Privat --- diff --git a/src/parser/nit.sablecc3xx b/src/parser/nit.sablecc3xx index 1931792..d7380c5 100644 --- a/src/parser/nit.sablecc3xx +++ b/src/parser/nit.sablecc3xx @@ -204,6 +204,7 @@ ge = '>='; gg = '>>'; starship = '<=>'; bang='!'; +quest='?'; at='@'; semi=';'; @@ -792,6 +793,7 @@ atid~forclass {-> atid} 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()} ; @@ -1053,6 +1055,7 @@ expr = {block} expr* kwend? | {debug_type} kwdebug kwtype expr type | {vararg} expr dotdotdot | {namedarg} id assign expr + | {safe} expr quest | {type} type | {methid} expr [id]:methid | {at} annotations diff --git a/src/parser/parser_abs.nit b/src/parser/parser_abs.nit index 2f42bfc..8c0930c 100644 --- a/src/parser/parser_abs.nit +++ b/src/parser/parser_abs.nit @@ -295,6 +295,9 @@ end class TBang super Token end +class TQuest + super Token +end class TAt super Token end @@ -1200,6 +1203,11 @@ class ANamedargExpr 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 diff --git a/src/parser/parser_nodes.nit b/src/parser/parser_nodes.nit index 0c535c2..92dbea0 100644 --- a/src/parser/parser_nodes.nit +++ b/src/parser/parser_nodes.nit @@ -983,6 +983,11 @@ class TStarship super TokenOperator end +# The operator `?` +class TQuest + super TokenOperator +end + # The operator `!` class TBang super TokenOperator @@ -2750,6 +2755,17 @@ class AVarargExpr 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