X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/2310330e7d4d724bf6641339836be8523f95c916..6d0fe9d5f8c513045bf064ea256c822beac19037:/src/parse.y diff --git a/src/parse.y b/src/parse.y index 46fdf6e..4cdb6a0 100644 --- a/src/parse.y +++ b/src/parse.y @@ -80,11 +80,13 @@ yyerror(char *str) } static void -push_variable(char *name, int scope, int line_no) +push_variable(char *name, int scope, int line_no, char *postfix) { Node *var; Type *type = typestack->data; typestack = g_list_remove(typestack,typestack->data); + + type->postfix = postfix; var = new_variable(scope,type,name,line_no); class_nodes = g_list_append(class_nodes, var); @@ -101,9 +103,23 @@ push_function(int scope, char *oid, char *id, char *onerror, type = typestack->data; typestack = g_list_remove(typestack,typestack->data); } else { - type = (Type *)new_type(0,g_strdup("void")); + type = (Type *)new_type(0,g_strdup("void"),NULL); } + /* a complicated and ugly test to figure out if we have + the wrong number of types for a signal */ + if((scope == SIGNAL_FIRST_METHOD || + scope == SIGNAL_LAST_METHOD || + scope == PRIVATE_SIGNAL_FIRST_METHOD || + scope == PRIVATE_SIGNAL_LAST_METHOD) && + g_list_length(gtktypes) != g_list_length(funcargs) && + !(g_list_length(funcargs) == 1 && + g_list_length(gtktypes) == 2 && + strcmp(gtktypes->next->data,"NONE")==0)) { + print_error(TRUE, _("The number of GTK arguments and " + "function arguments for a signal " + "don't seem to match"),line_no); + } node = new_method(scope,type,oid,gtktypes,id,funcargs, onerror,cbuf,line_no,ccode_line,vararg); gtktypes = NULL; @@ -113,11 +129,13 @@ push_function(int scope, char *oid, char *id, char *onerror, } static void -push_funcarg(char *name) +push_funcarg(char *name, char *postfix) { Node *node; Type *type = typestack->data; typestack = g_list_remove(typestack,typestack->data); + + type->postfix = postfix; node = new_funcarg(type,name,checks); checks = NULL; @@ -137,7 +155,7 @@ push_init_arg(char *name, int is_class) else tn = g_strdup(((Class *)class)->otype); - type = new_type(1,tn); + type = new_type(1,tn,NULL); node = new_funcarg((Type *)type,name,NULL); funcargs = g_list_prepend(funcargs, node); } @@ -148,7 +166,7 @@ push_self(char *id) Node *node; Node *type; GList *ch = NULL; - type = new_type(1,g_strdup(((Class *)class)->otype)); + type = new_type(1,g_strdup(((Class *)class)->otype),NULL); ch = g_list_append(ch,new_check(NULL_CHECK,NULL)); ch = g_list_append(ch,new_check(TYPE_CHECK,NULL)); node = new_funcarg((Type *)type,id,ch); @@ -170,7 +188,7 @@ push_self(char *id) %token SIGNED UNSIGNED LONG SHORT INT FLOAT DOUBLE CHAR %token ONERROR -%token TOKEN NUMBER TYPETOKEN +%token TOKEN NUMBER TYPETOKEN ARRAY_DIM %token CCODE HCODE %token PUBLIC PRIVATE ARGUMENT VIRTUAL SIGNAL OVERRIDE @@ -205,6 +223,11 @@ class: classdec '{' classcode '}' { class_nodes = NULL; nodes = g_list_append(nodes,class); } + | classdec '{' '}' { + ((Class *)class)->nodes = NULL; + class_nodes = NULL; + nodes = g_list_append(nodes,class); + } ; classdec: CLASS TYPETOKEN FROM TYPETOKEN { @@ -221,11 +244,17 @@ classcode: classcode method { ; } ; variable: PUBLIC type TOKEN ';' { - push_variable($3,PUBLIC_SCOPE,$1); + push_variable($3,PUBLIC_SCOPE,$1,NULL); + } + | PUBLIC type TOKEN ARRAY_DIM ';' { + push_variable($3,PUBLIC_SCOPE,$1,$4); } - | PRIVATE type TOKEN ';' { - push_variable($3,PRIVATE_SCOPE,$1); + | PRIVATE type TOKEN ';' { + push_variable($3,PRIVATE_SCOPE,$1,NULL); } + | PRIVATE type TOKEN ARRAY_DIM ';' { + push_variable($3,PRIVATE_SCOPE,$1,$4); + } ; argument: ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { if(strcmp($5,"get")==0 && @@ -305,11 +334,11 @@ type: type1 { ; } ; type1: type2 { - Node *node = new_type(0,$1); + Node *node = new_type(0,$1,NULL); typestack = g_list_prepend(typestack,node); } | type2 stars { - Node *node = new_type(stars,$1); + Node *node = new_type(stars,$1,NULL); stars = 0; typestack = g_list_prepend(typestack,node); } @@ -386,6 +415,10 @@ stars: '*' stars { stars++; } | '*' { stars++; } ; +optpublic: { ; } + | PUBLIC { ; } + ; + fullsigtype: PRIVATE TOKEN sigtype { if(strcmp($2,"first")==0) $$ = PRIVATE_SIGNAL_FIRST_METHOD; @@ -413,7 +446,7 @@ fullsigtype: PRIVATE TOKEN sigtype { | PRIVATE sigtype { $$ = PRIVATE_SIGNAL_LAST_METHOD; } - | TOKEN sigtype { + | TOKEN sigtype { if(strcmp($1,"first")==0) $$ = SIGNAL_FIRST_METHOD; else if(strcmp($1,"last")==0) @@ -425,6 +458,33 @@ fullsigtype: PRIVATE TOKEN sigtype { } g_free($1); } + | PUBLIC TOKEN sigtype { + if(strcmp($2,"first")==0) + $$ = SIGNAL_FIRST_METHOD; + else if(strcmp($2,"last")==0) + $$ = SIGNAL_LAST_METHOD; + else { + yyerror(_("signal must be 'first' or 'last'")); + g_free($2); + YYERROR; + } + g_free($2); + } + | TOKEN PUBLIC sigtype { + if(strcmp($1,"first")==0) + $$ = SIGNAL_FIRST_METHOD; + else if(strcmp($1,"last")==0) + $$ = SIGNAL_LAST_METHOD; + else { + yyerror(_("signal must be 'first' or 'last'")); + g_free($1); + YYERROR; + } + g_free($1); + } + | PUBLIC sigtype { + $$ = SIGNAL_LAST_METHOD; + } | sigtype { $$ = SIGNAL_LAST_METHOD; } @@ -468,14 +528,14 @@ method: SIGNAL fullsigtype type TOKEN '(' funcargs ')' onerror codenocode { $8, $9,$1, ccode_line,vararg); } - | VIRTUAL type TOKEN '(' funcargs ')' onerror codenocode { + | VIRTUAL optpublic type TOKEN '(' funcargs ')' onerror codenocode { if(!has_self) { yyerror(_("virtual method without 'self' as " "first parameter")); YYERROR; } - push_function(VIRTUAL_METHOD, NULL, $3, - $7, $8,$1, + push_function(VIRTUAL_METHOD, NULL, $4, + $8, $9,$1, ccode_line,vararg); } | OVERRIDE '(' TYPETOKEN ')' type TOKEN '(' funcargs ')' onerror '{' CCODE { @@ -558,7 +618,10 @@ arglist1: arglist1 ',' arg { ; } ; arg: type TOKEN { - push_funcarg($2); + push_funcarg($2,NULL); + } + | type TOKEN ARRAY_DIM { + push_funcarg($2,$3); } | type TOKEN '(' TOKEN checklist ')' { if(strcmp($4,"check")!=0) { @@ -566,7 +629,15 @@ arg: type TOKEN { YYERROR; } g_free($4); - push_funcarg($2); + push_funcarg($2,NULL); + } + | type TOKEN ARRAY_DIM '(' TOKEN checklist ')' { + if(strcmp($5,"check")!=0) { + yyerror(_("parse error")); + YYERROR; + } + g_free($5); + push_funcarg($2,$3); } ;