X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/64034bc2613afefb289d1450411e69a0de4bce4e..a611f21fab136f64bbf979bd62b2fc6ecb62933c:/src/parse.y diff --git a/src/parse.y b/src/parse.y index 449ef3c..7d01a5d 100644 --- a/src/parse.y +++ b/src/parse.y @@ -104,6 +104,20 @@ push_function(int scope, char *oid, char *id, char *onerror, type = (Type *)new_type(0,g_strdup("void")); } + /* 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; @@ -162,6 +176,7 @@ push_self(char *id) GString *cbuf; GList *list; int line; + int sigtype; } %token CLASS FROM @@ -384,6 +399,50 @@ tspecifier: ENUM { stars: '*' stars { stars++; } | '*' { stars++; } ; + +fullsigtype: PRIVATE TOKEN sigtype { + if(strcmp($2,"first")==0) + $$ = PRIVATE_SIGNAL_FIRST_METHOD; + else if(strcmp($2,"last")==0) + $$ = PRIVATE_SIGNAL_LAST_METHOD; + else { + yyerror(_("signal must be 'first' or 'last'")); + g_free($2); + YYERROR; + } + g_free($2); + } + | TOKEN PRIVATE sigtype { + if(strcmp($1,"first")==0) + $$ = PRIVATE_SIGNAL_FIRST_METHOD; + else if(strcmp($1,"last")==0) + $$ = PRIVATE_SIGNAL_LAST_METHOD; + else { + yyerror(_("signal must be 'first' or 'last'")); + g_free($1); + YYERROR; + } + g_free($1); + } + | PRIVATE sigtype { + $$ = PRIVATE_SIGNAL_LAST_METHOD; + } + | TOKEN 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); + } + | sigtype { + $$ = SIGNAL_LAST_METHOD; + } + ; sigtype: TOKEN '(' tokenlist ')' { gtktypes = g_list_prepend(gtktypes,$1); @@ -403,36 +462,24 @@ codenocode: '{' CCODE { $$=$2; } ; /*here CCODE will include the ending '}' */ -method: SIGNAL TOKEN sigtype type TOKEN '(' funcargs ')' onerror codenocode { - int sigtype = SIGNAL_LAST_METHOD; - if(strcmp($2,"first")==0) - sigtype = SIGNAL_FIRST_METHOD; - else if(strcmp($2,"last")==0) - sigtype = SIGNAL_LAST_METHOD; - else { - yyerror(_("signal must be 'first' or 'last'")); - g_free($2); - YYERROR; - } - g_free($2); - +method: SIGNAL fullsigtype type TOKEN '(' funcargs ')' onerror codenocode { if(!has_self) { yyerror(_("signal without 'self' as " "first parameter")); YYERROR; } - push_function(sigtype,NULL, - $5, $9, $10,$1, + push_function($2,NULL, + $4, $8, $9,$1, ccode_line,vararg); } - | SIGNAL sigtype type TOKEN '(' funcargs ')' onerror codenocode { + | VIRTUAL PRIVATE type TOKEN '(' funcargs ')' onerror codenocode { if(!has_self) { - yyerror(_("signal without 'self' as " + yyerror(_("virtual method without 'self' as " "first parameter")); YYERROR; } - push_function(SIGNAL_LAST_METHOD, NULL, - $4, $8, $9,$1, + push_function(PRIVATE_VIRTUAL_METHOD, NULL, $4, + $8, $9,$1, ccode_line,vararg); } | VIRTUAL type TOKEN '(' funcargs ')' onerror codenocode { @@ -461,35 +508,17 @@ method: SIGNAL TOKEN sigtype type TOKEN '(' funcargs ')' onerror codenocode { $7, $9,$1,$8, vararg); } - | TOKEN '(' TOKEN ')' ';' { - if(strcmp($1,"init")==0) { - push_init_arg($3,FALSE); - push_function(INIT_METHOD, NULL, $1, - NULL, NULL,$2,0, - FALSE); - } else if(strcmp($1,"class_init")==0) { - push_init_arg($3,TRUE); - push_function(CLASS_INIT_METHOD, NULL, - $1, NULL, NULL,$2,0, - FALSE); - } else { - g_free($1); - g_free($3); - yyerror(_("parse error")); - YYERROR; - } - } - | TOKEN '(' TOKEN ')' '{' CCODE { + | TOKEN '(' TOKEN ')' codenocode { if(strcmp($1,"init")==0) { push_init_arg($3,FALSE); push_function(INIT_METHOD, NULL, - $1, NULL, $6,$2, - $5,FALSE); + $1, NULL, $5,$2, + ccode_line,FALSE); } else if(strcmp($1,"class_init")==0) { push_init_arg($3,TRUE); push_function(CLASS_INIT_METHOD, NULL, - $1, NULL, $6,$2, - $5,FALSE); + $1, NULL, $5,$2, + ccode_line,FALSE); } else { g_free($1); g_free($3); @@ -509,15 +538,11 @@ onerror: ONERROR numtok { $$ = $2; } | { $$ = NULL; } ; -funcargs: VOID { has_self = FALSE; } +funcargs: VOID { vararg = FALSE; has_self = FALSE; } | TOKEN { + vararg = FALSE; has_self = TRUE; - if(strcmp($1,"this")==0) { - push_self($1); - print_error(TRUE,_("Use of 'this' is " - "depreciated, use 'self' " - "instead"),line_no); - } else if(strcmp($1,"self")==0) + if(strcmp($1,"self")==0) push_self($1); else { g_free($1); @@ -527,12 +552,7 @@ funcargs: VOID { has_self = FALSE; } } | TOKEN ',' arglist { has_self = TRUE; - if(strcmp($1,"this")==0) { - push_self($1); - print_error(TRUE,_("Use of 'this' is " - "depreciated, use 'self' " - "instead"),line_no); - } else if(strcmp($1,"self")==0) + if(strcmp($1,"self")==0) push_self($1); else { g_free($1);