syntax: refactor AClosureCallExpr
[nit.git] / src / parser / nit.sablecc3xx
index 4a5137e..073d135 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';
@@ -167,7 +167,7 @@ import
        ;
 
 implicit_top_class {-> classdef}
-       = tl_propdefs {-> New classdef.top([tl_propdefs.propdef])};
+       = propdefs_toplevel {-> New classdef.top([propdefs_toplevel.propdef])};
 
 implicit_main_class {-> classdef?}
        = implicit_main_meth {-> New classdef.main([implicit_main_meth.propdef])}
@@ -198,19 +198,24 @@ formaldef
 special {-> superclass}
        = no kwspecial [n2]:no type {-> New superclass(kwspecial, type)};
 
-propdefs {-> propdef*}
-       = propdef n1 propdefs_tail* {-> [propdef, propdefs_tail.propdef]};
-propdefs_tail {-> propdef} 
-       = propdef n1 {-> propdef};
-propdef 
-       = {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)}
-       | {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)}
-       | {deferred} [doc]:no redef visibility kwmeth methid signature kwis kwabstract {-> New propdef.deferred_meth(doc.doc, redef.kwredef, visibility, kwmeth, methid, signature.signature)}
-       | {intern} [doc]:no redef visibility kwmeth methid signature kwis kwintern {-> New propdef.intern_meth(doc.doc, redef.kwredef, visibility, kwmeth, methid, signature.signature)}
+propdefs~toplevel {-> propdef*}
+       = propdef~toplevel n1 propdefs_tail~toplevel* {-> [propdef~toplevel.propdef, propdefs_tail~toplevel.propdef]}
+       ;
+propdefs_tail~toplevel {-> propdef}
+       = propdef~toplevel n1 {-> propdef~toplevel.propdef}
+       ;
+propdef~toplevel {-> propdef}
+       = {meth} [doc]:no redef visibility kwmeth methid signature kwdo stmtso kwend? {-> New propdef.concrete_meth(doc.doc, redef.kwredef, visibility, kwmeth, methid, signature, stmtso.expr)}
+!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)}
-       | {meth} [doc]:no redef visibility kwmeth methid signature kwdo stmtso kwend? {-> New propdef.concrete_meth(doc.doc, redef.kwredef, visibility, kwmeth, methid, signature, stmtso.expr)}
-       | {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)}
-       | {type} [doc]:no redef visibility kwtype classid typing {-> New propdef.type(doc.doc, redef.kwredef, visibility, kwtype, classid, typing.type)}
+//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)}
        ;
 readable {-> able?}
        = redef kwreadable {-> New able.read(redef.kwredef, kwreadable)}
@@ -221,15 +226,6 @@ writable {-> able?}
        | {empty} {-> Null}
        ;
 
-tl_propdefs {-> propdef*}
-       = tl_propdef n1 tl_propdefs_tail* {-> [tl_propdef.propdef, tl_propdefs_tail.propdef]};
-tl_propdefs_tail {-> propdef} 
-       = tl_propdef n1 {-> tl_propdef.propdef};
-tl_propdef {-> propdef}
-       = {extern} [doc]:no redef visibility kwmeth methid signature kwis kwextern string? {-> New propdef.extern_meth(doc.doc, redef.kwredef, visibility, kwmeth, methid, signature, string)}
-       | {meth} [doc]:no redef visibility kwmeth methid signature kwdo stmtso {-> New propdef.concrete_meth(doc.doc, redef.kwredef, visibility, kwmeth, methid, signature, stmtso.expr)}
-       ;
-
 visibility
        = {public} {-> New visibility.public()}
        | {private} kwprivate no {-> New visibility.private(kwprivate)}
@@ -283,7 +279,7 @@ closure_decl
        ;
 
 /* TYPES *********************************************************************/
-type~nopar~nobra {-> type}
+type~nobra {-> type}
        = {simple} classid {-> New type(classid, [])}
 !nobra | {generic} classid obra no types [n2]:no cbra {-> New type(classid, [types.type])}
        ;
@@ -317,7 +313,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])}
@@ -414,7 +409,7 @@ expr_eq~nopar~nobra {-> expr}
        | {gt} expr_add~nopar~nobra gt no [expr2]:expr_add~nopar~nobra {-> New expr.gt(expr_add~nopar~nobra.expr, expr2.expr)}
        | {ge} expr_add~nopar~nobra ge no [expr2]:expr_add~nopar~nobra {-> New expr.ge(expr_add~nopar~nobra.expr, expr2.expr)}
        | {starship} expr_add~nopar~nobra starship no [expr2]:expr_add~nopar~nobra {-> New expr.starship(expr_add~nopar~nobra.expr, expr2.expr)}
-       | {isa} expr_add~nopar~nobra kwisa no type~nopar~nobra {-> New expr.isa(expr_add~nopar~nobra.expr, type~nopar~nobra.type)}
+       | {isa} expr_add~nopar~nobra kwisa no type~nobra {-> New expr.isa(expr_add~nopar~nobra.expr, type~nobra.type)}
        ;
 
 expr_add~nopar~nobra {-> expr}
@@ -438,7 +433,7 @@ expr_minus~nopar~nobra {-> expr}
 
 expr_new~nopar~nobra {-> expr}
        = expr_atom~nopar~nobra {-> expr_atom~nopar~nobra.expr}
-       | {new} kwnew no type~nopar~nobra args {-> New expr.new(kwnew, type~nopar~nobra.type, Null, [args.expr])}
+       | {new} kwnew no type~nobra args {-> New expr.new(kwnew, type~nobra.type, Null, [args.expr])}
        ;
 
 expr_atom~nopar~nobra {-> expr}
@@ -447,7 +442,7 @@ expr_atom~nopar~nobra {-> expr}
        | {super} qualified? kwsuper args {-> New expr.super(qualified, kwsuper, [args.expr])}
        | {init} recv~nopar~nobra kwinit args {-> New expr.init(recv~nopar~nobra.expr, kwinit, [args.expr])}
 !nobra!nopar   | {bra} expr_atom braargs {-> New expr.bra(expr_atom.expr, [braargs.expr], [])}
-       | {new} kwnew no type~nopar~nobra dot [n2]:no id args {-> New expr.new(kwnew, type~nopar~nobra.type, id, [args.expr])}
+       | {new} kwnew no type~nobra dot [n2]:no id args {-> New expr.new(kwnew, type~nobra.type, id, [args.expr])}
 !nobra!nopar   | {range} obra no expr [n2]:no dotdot [n3]:no [expr2]:expr_nobra [n4]:no cbra {-> New expr.crange(expr, expr2.expr)}
 !nobra!nopar   | {orange} obra no expr [n2]:no dotdot [n3]:no [expr2]:expr_nobra [n4]:no [cbra]:obra  {-> New expr.orange(expr, expr2.expr)}
 !nobra!nopar   | {array} braargs {-> New expr.array([braargs.expr])}
@@ -562,7 +557,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 
@@ -634,6 +629,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