syntax: 'meth' -> 'fun', 'attr' -> 'var'
[nit.git] / src / parser / nit.sablecc3xx
index 5412b2b..f79a6b1 100644 (file)
@@ -65,9 +65,9 @@ kwinterface = 'interface';
 kwuniversal = 'universal';
 kwspecial = 'special';
 kwend = 'end';
-kwmeth = 'meth';
+kwmeth = 'meth' | 'fun'; //FIXME: Remove the 'meth' alternative once the transition is done
 kwtype = 'type';
-kwattr = 'attr';
+kwattr = 'attr'; //FIXME: remove kwattr once the transition is done
 kwinit = 'init';
 kwredef = 'redef';
 kwis = 'is';
@@ -104,6 +104,8 @@ kwfalse = 'false';
 kwnull = 'null';
 kwas = 'as';
 kwwith = 'with';
+kwnullable = 'nullable';
+kwisset = 'isset';
 
 opar = '(';
 cpar = ')';
@@ -209,8 +211,11 @@ propdef~toplevel {-> propdef}
 !toplevel| {deferred} [doc]:no redef visibility kwmeth methid signature kwis kwabstract {-> New propdef.deferred_meth(doc.doc, redef.kwredef, visibility, kwmeth, methid, signature.signature)}
 !toplevel| {intern} [doc]:no redef visibility kwmeth methid signature kwis kwintern {-> New propdef.intern_meth(doc.doc, redef.kwredef, visibility, kwmeth, methid, signature.signature)}
        | {extern} [doc]:no redef visibility kwmeth methid signature kwis kwextern string? {-> New propdef.extern_meth(doc.doc, redef.kwredef, visibility, kwmeth, methid, signature.signature, string)}
-!toplevel| {attr} [doc]:no readable writable redef visibility kwattr attrid typing? {-> New propdef.attr(doc.doc, readable.able, writable.able, redef.kwredef, visibility, kwattr, attrid, typing.type, Null)}
-!toplevel| {attr2} [doc]:no readable writable redef visibility kwattr attrid typing? assign [n2]:no expr {-> New propdef.attr(doc.doc, readable.able, writable.able, redef.kwredef, visibility, kwattr, attrid, typing.type, expr)}
+//FIXME: Remove attr alternative once the transition is done
+!toplevel| {attr} [doc]:no readable writable redef visibility kwattr attrid typing? {-> New propdef.attr(doc.doc, readable.able, writable.able, redef.kwredef, visibility, kwattr, Null, attrid, typing.type, Null)}
+!toplevel| {attr2} [doc]:no readable writable redef visibility kwattr attrid typing? assign [n2]:no expr {-> New propdef.attr(doc.doc, readable.able, writable.able, redef.kwredef, visibility, kwattr, Null, attrid, typing.type, expr)}
+!toplevel| {var} [doc]:no readable writable redef visibility kwvar attrid typing? {-> New propdef.attr(doc.doc, readable.able, writable.able, redef.kwredef, visibility, Null, kwvar, attrid, typing.type, Null)}
+!toplevel| {var2} [doc]:no readable writable redef visibility kwvar attrid typing? assign [n2]:no expr {-> New propdef.attr(doc.doc, readable.able, writable.able, redef.kwredef, visibility, Null, kwvar, attrid, typing.type, expr)}
 !toplevel| {init} [doc]:no redef visibility kwinit methid? signature kwdo stmtso kwend? {-> New propdef.concrete_init(doc.doc, redef.kwredef, visibility, kwinit, methid, signature, stmtso.expr)}
 !toplevel| {type} [doc]:no redef visibility kwtype classid typing {-> New propdef.type(doc.doc, redef.kwredef, visibility, kwtype, classid, typing.type)}
        ;
@@ -277,8 +282,8 @@ closure_decl
 
 /* TYPES *********************************************************************/
 type~nobra {-> type}
-       = {simple} classid {-> New type(classid, [])}
-!nobra | {generic} classid obra no types [n2]:no cbra {-> New type(classid, [types.type])}
+       = {simple} kwnullable? classid {-> New type(kwnullable, classid, [])}
+!nobra | {generic} kwnullable? classid obra no types [n2]:no cbra {-> New type(kwnullable, classid, [types.type])}
        ;
 types {-> type*} 
        = type types_tail* {-> [type, types_tail.type]};
@@ -310,7 +315,6 @@ stmt~withelse {-> expr}
        | {while} while~withelse {-> while~withelse.expr}
        | {for} for~withelse {-> for~withelse.expr}
        | {assert} assert~withelse {-> assert~withelse.expr}
-//     | {expr} expr {-> expr.expr}
        | {call} recv id args_nopar closure_defs~withelse? {-> New expr.call(recv.expr, id, [args_nopar.expr], [closure_defs~withelse.closure_def])}
        | {super} qualified? kwsuper args_nopar {-> New expr.super(qualified, kwsuper, [args_nopar.expr])}
        | {init} recv kwinit args_nopar {-> New expr.init(recv.expr, kwinit, [args_nopar.expr])}
@@ -432,6 +436,7 @@ expr_minus~nopar~nobra {-> expr}
 expr_new~nopar~nobra {-> expr}
        = expr_atom~nopar~nobra {-> expr_atom~nopar~nobra.expr}
        | {new} kwnew no type~nobra args {-> New expr.new(kwnew, type~nobra.type, Null, [args.expr])}
+       | {isset_attr} kwisset recv~nopar~nobra attrid {-> New expr.isset_attr(kwisset, recv~nopar~nobra.expr, attrid)}
        ;
 
 expr_atom~nopar~nobra {-> expr}
@@ -455,6 +460,7 @@ expr_atom~nopar~nobra {-> expr}
        | {superstring} superstring  {-> superstring.expr}
 !nopar | {par} opar expr cpar {-> expr}
         | {as_cast} expr_atom~nopar~nobra dot no kwas [n2]:no opar [n3]:no type [n4]:no cpar {-> New expr.as_cast(expr_atom~nopar~nobra.expr, kwas, type)}
+        | {as_notnull} expr_atom~nopar~nobra dot no kwas [n2]:no opar [n3]:no kwnot [n4]:no kwnull [n5]:no cpar {-> New expr.as_notnull(expr_atom~nopar~nobra.expr, kwas, kwnot, kwnull)}
        ;
 
 superstring {-> expr} 
@@ -555,7 +561,7 @@ formaldef = [id]:classid type?;
 superclass = kwspecial type;
 
 
-propdef = {attr} doc? [readable]:able? [writable]:able? kwredef? visibility kwattr [id]:attrid type? expr?
+propdef = {attr} doc? [readable]:able? [writable]:able? kwredef? visibility kwattr? kwvar? [id]:attrid type? expr? // Remove the kwattr? once the transition is done
        | {meth} doc? kwredef? visibility methid signature 
        | {deferred_meth} doc? kwredef? visibility kwmeth methid signature 
        | {intern_meth} doc? kwredef? visibility kwmeth methid signature 
@@ -580,7 +586,7 @@ param       = id type? dotdotdot?
 closure_decl = kwwith kwbreak? id signature expr?
        ;
 
-type   = [id]:classid [types]:type*;
+type   = kwnullable? [id]:classid [types]:type*;
 
 expr   = {block} expr* 
        | {vardecl} kwvar id type? assign? expr? 
@@ -627,6 +633,7 @@ expr        = {block} expr*
        | {bra} expr [args]:expr* [closure_defs]:closure_def* 
        | {bra_assign} expr [args]:expr* assign [value]:expr 
        | {bra_reassign} expr [args]:expr* assign_op [value]:expr 
+       | {closure_call} id [args]:expr* [closure_defs]:closure_def*
        | {var} id
        | {var_assign} id assign [value]:expr 
        | {var_reassign} id assign_op [value]:expr 
@@ -649,6 +656,8 @@ expr        = {block} expr*
        | {superstring} [exprs]:expr*
        | {par} expr 
         | {as_cast} expr kwas type
+        | {as_notnull} expr kwas kwnot kwnull
+       | {isset_attr} kwisset expr [id]:attrid
        ;
 assign_op
        = {plus} pluseq