unoidl2

Unnamed repository; edit this file to name it for gitweb.
git clone https://logand.com/git/unoidl2.git/
Log | Files | Refs

commit 23e8559d07bba59d07dd06b7812975b1a2349135
parent d609a79b0db040cba5415e3355d951bede95b38e
Author: Tomas Hlavaty <tom@logand.com>
Date:   Thu, 15 Dec 2011 23:28:17 +0100

deftemplate improved

Diffstat:
Mparse.y | 9++++-----
Munoidl2java.c | 44+++++++++++++++++++++++++++++---------------
2 files changed, 33 insertions(+), 20 deletions(-)

diff --git a/parse.y b/parse.y @@ -80,16 +80,15 @@ single_inheritance: nil | COLON name {$$ = $2}; struct_members: struct_member {$$ = list1($1);} | struct_member struct_members {$$ = cons($1, $2);}; struct_member: type identifier SEMICOLON {$$ = list2($2, $1);}; -deftemplate: published STRUCT identifier struct_params +deftemplate: published STRUCT identifier LT identifiers GT LCURLY template_members RCURLY SEMICOLON - {$$ = cons5(mk(DEFTEMPLATE, "deftemplate"), $3, $1, $4, $6);}; -struct_params: LT identifiers GT {$$ = $2;}; + {$$ = cons5(mk(DEFTEMPLATE, "deftemplate"), $3, $1, $5, $8);}; identifiers: identifier {$$ = list1($1);} | identifier COMMA identifiers {$$ = cons($1, $3)}; -template_members: template_member +template_members: template_member {$$ = list1($1);} | template_member template_members {$$ = cons($1, $2);}; template_member: struct_member | parametric_member; -parametric_member: identifier identifier SEMICOLON {$$ = list2($1, $2);}; +parametric_member: identifier identifier SEMICOLON {$$ = list2($2, $1);}; defexception: published EXCEPTION identifier single_inheritance LCURLY struct_members_opt RCURLY SEMICOLON {$$ = cons5($2, $3, $1, $4, $6);}; struct_members_opt: nil | struct_members; diff --git a/unoidl2java.c b/unoidl2java.c @@ -127,20 +127,12 @@ static void pr_args2(Any x) { // for in, out, inout } } -static void pr_struct(Any x) { - Any name = cadr(x); - Any published = caddr(x); - Any super = cadddr(x); - Any slots = cddddr(x); - pr_package(name); - pr("public class "); pp(name); - if(!null(super)) {pr(" extends "); pp(super);} - pl(" { // struct"); +static void pr_slots(Any slots, Any name) { for(Any y = slots; !null(y); y = cdr(y)) { Any slot = car(y); Any n = car(slot); Any t = cadr(slot); - pr(" public "); pp(t); pr(" "); pp(n); pl(";"); + pr(" public "); pp(t); pr(" _"); pp(n); pl(";"); } pr(" public "); pp(name); pl("() {"); // TODO init enum to default @@ -151,7 +143,7 @@ static void pr_struct(Any x) { Any n = car(slot); Any t = cadr(slot); // TODO if Object => super(slot); - pr(" this."); pp(n); pr(" = "); pp(n); pl(";"); + pr(" this._"); pp(n); pr(" = _"); pp(n); pl(";"); } pl(" }"); for(Any y = slots; !null(y); y = cdr(y)) { @@ -159,12 +151,24 @@ static void pr_struct(Any x) { Any n = car(slot); Any t = cadr(slot); pr(" public "); pp(t); pr(" get"); pp(n); pl("() {"); - pr(" return this."); pp(n); pl(";"); + pr(" return this._"); pp(n); pl(";"); pl(" }"); - pr(" public void set"); pp(n); pr("("); pp(t); pr(" "); pp(n); pl(") {"); - pr(" this."); pp(n); pr(" = "); pp(n); pl(";"); + pr(" public void set"); pp(n); pr("("); pp(t); pr(" _"); pp(n); pl(") {"); + pr(" this._"); pp(n); pr(" = _"); pp(n); pl(";"); pl(" }"); } +} + +static void pr_struct(Any x) { + Any name = cadr(x); + Any published = caddr(x); + Any super = cadddr(x); + Any slots = cddddr(x); + pr_package(name); + pr("public class "); pp(name); + if(!null(super)) {pr(" extends "); pp(super);} + pl(" { // struct"); + pr_slots(slots, name); pl("}"); } @@ -312,7 +316,16 @@ static void pr_property(Any x) { pr(" public void set"); pp(name); pr("("); pp(type); pr(" "); pp(name); pl(");"); } -static void pr_deftemplate(Any x) { // TODO (deftemplate Pair T (T U) (T First) U Second) +static void pr_deftemplate(Any x) { + Any name = cadr(x); + Any published = caddr(x); + Any args = cadddr(x); + Any slots = cddddr(x); + pr_package(name); + pr("public class "); pp(name); + pr("<"); pp_list(args, ", "); pr(">"); pl(" { // deftemplate"); + pr_slots(slots, name); + pl("}"); } static void pp(Any x) { @@ -328,6 +341,7 @@ static void pp(Any x) { case ENUM: pr_enum(x); break; case STRUCT: pr_struct(x); break; case DEFINTERFACE: pr_definterface(x); break; + case DEFTEMPLATE: pr_deftemplate(x); break; case METHOD: pr_method(x); break; //case IN: //case OUT: