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';
kwnull = 'null';
kwas = 'as';
kwwith = 'with';
+kwnullable = 'nullable';
+kwisset = 'isset';
opar = '(';
cpar = ')';
!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)}
;
/* 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]};
| {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])}
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}
| {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}
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
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?
| {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
| {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