Merge: Safe call operator
[nit.git] / src / parser / nit.sablecc3xx
index f626841..d7380c5 100644 (file)
@@ -204,6 +204,7 @@ ge = '>=';
 gg = '>>';
 starship = '<=>';
 bang='!';
+quest='?';
 at='@';
 semi=';';
 
@@ -218,10 +219,12 @@ start_string = id? '"' str_body '{' | id? '"' '"' '"' long_str_body lsend2;
 mid_string = '}' str_body '{' | '}' '}' '}' long_str_body lsend2;
 end_string = '}' str_body '"' id? | '}' '}' '}' long_str_body lsend1 id? ;
 char = id? ((''' [[any - '''] - '\'] ''') | (''' '\' any ''')) id?;
-bad_string = ('"'|'}') str_body | '"' '"' '"' long_str_body | ''' ''' ''' long_sstr_body;
+bad_string = ('"'|'}') str_body ;
+bad_t_string = '"' '"' '"' long_str_body | ''' ''' ''' long_sstr_body;
 bad_char = ''' '\'? any;
 
 extern_code_segment = '`' '{' extern_code_body '`' '}';
+bad_extern = '`' '{' extern_code_body;
 
 /*****************************************************************************/
 Ignored Tokens
@@ -790,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()}
        ;
 
@@ -1051,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