eol = eol_helper;
comment = '#' any* eol_helper;
-kwpackage = 'package';
+kwmodule = 'package'|'module';
kwimport = 'import';
kwclass = 'class';
kwabstract = 'abstract';
kwinterface = 'interface';
-kwuniversal = 'universal';
+kwenum = 'universal'|'enum';
kwspecial = 'special';
kwend = 'end';
kwmeth = 'fun';
/* MODULES *******************************************************************/
module
- = packagedecl? [imports]:import* [classdefs]:classdef* implicit_top_class? implicit_main_class? {-> New module(packagedecl, [imports.import],[classdefs.classdef,implicit_top_class.classdef,implicit_main_class.classdef])};
+ = moduledecl? [imports]:import* [classdefs]:classdef* implicit_top_class? implicit_main_class? {-> New module(moduledecl, [imports.import],[classdefs.classdef,implicit_top_class.classdef,implicit_main_class.classdef])};
-packagedecl
- = [doc]:no kwpackage no id [n2]:n1 {-> New packagedecl(doc.doc, kwpackage, id)};
+moduledecl
+ = [doc]:no kwmodule no id [n2]:n1 {-> New moduledecl(doc.doc, kwmodule, id)};
import
= {std} [doc]:no visibility kwimport no id [n2]:n1 {-> New import.std(visibility, kwimport, id)}
= {concrete} kwclass
| {abstract} kwabstract kwclass
| {interface} kwinterface
- | {universal} kwuniversal
+ | {enum} kwenum
;
formaldefs {-> formaldef*}
;
for~withelse {-> expr}
- = kwfor no id [n2]:no kwin [n3]:no expr [n4]:no kwdo stmtso_withend label {-> New expr.for(kwfor, id, expr, kwdo, stmtso_withend.expr, label)}
- | {nolabel} kwfor no id [n2]:no kwin [n3]:no expr [n4]:no kwdo stmtso~withelse {-> New expr.for(kwfor, id, expr, kwdo, stmtso~withelse.expr, Null)}
+ = kwfor no [ids]:idlist [n2]:no kwin [n3]:no expr [n4]:no kwdo stmtso_withend label {-> New expr.for(kwfor, [ids.id], expr, kwdo, stmtso_withend.expr, label)}
+ | {nolabel} kwfor no [ids]:idlist [n2]:no kwin [n3]:no expr [n4]:no kwdo stmtso~withelse {-> New expr.for(kwfor, [ids.id], expr, kwdo, stmtso~withelse.expr, Null)}
;
assert~withelse {-> expr}
| {init} recv~nopar~nobra kwinit args {-> New expr.init(recv~nopar~nobra.expr, kwinit, [args.expr])}
!nobra | {bra} expr_atom~nopar braargs {-> New expr.bra(expr_atom~nopar.expr, [braargs.expr], [])}
| {new} kwnew no type~nobra dot [n2]:no id args {-> New expr.new(kwnew, type~nobra.type, id, [args.expr])}
-// FIXME: Why are these 3 !nopar mandatory?
+// !nopar to unambiguise 'foo[5].bar' between '(foo[5]).bar' and 'foo([5].bar),
!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])}
Abstract Syntax Tree
/*****************************************************************************/
-module = packagedecl? [imports]:import* [classdefs]:classdef*;
+module = moduledecl? [imports]:import* [classdefs]:classdef*;
-packagedecl
- = doc? kwpackage id;
+moduledecl
+ = doc? kwmodule id;
import = {std} visibility kwimport id
| {no} visibility kwimport kwend
= {concrete} kwclass
| {abstract} kwabstract kwclass
| {interface} kwinterface
- | {universal} kwuniversal
+ | {enum} kwenum
;
formaldef = [id]:classid type?;
superclass = kwspecial? kwsuper? type;
| {ifexpr} kwif expr kwthen [then]:expr kwelse [else]:expr
| {while} kwwhile expr kwdo [block]:expr? label?
| {loop} kwloop [block]:expr? label?
- | {for} kwfor id expr kwdo [block]:expr? label?
+ | {for} kwfor [ids]:id* expr kwdo [block]:expr? label?
| {assert} kwassert id? expr [else]:expr?
| {once} kwonce expr
| {send} expr