X-Git-Url: http://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/6d0fe9d5f8c513045bf064ea256c822beac19037..2255b3d84eeb947d4c065332f16e410ae4704c63:/src/parse.y diff --git a/src/parse.y b/src/parse.y index 4cdb6a0..f4c4a40 100644 --- a/src/parse.y +++ b/src/parse.y @@ -46,6 +46,10 @@ static int vararg = FALSE; static GList *gtktypes = NULL; +/* this can be a global as we will only do one function at a time + anyway */ +static int the_scope = NO_SCOPE; + void free(void *ptr); int yylex(void); @@ -93,13 +97,14 @@ push_variable(char *name, int scope, int line_no, char *postfix) } static void -push_function(int scope, char *oid, char *id, char *onerror, +push_function(int scope, int method, char *oid, char *id, char *onerror, GString *cbuf,int line_no, int ccode_line, int vararg) { Node *node; Type *type; + char *c_cbuf; - if(scope!=INIT_METHOD && scope!=CLASS_INIT_METHOD) { + if(method!=INIT_METHOD && method!=CLASS_INIT_METHOD) { type = typestack->data; typestack = g_list_remove(typestack,typestack->data); } else { @@ -108,10 +113,8 @@ push_function(int scope, char *oid, char *id, char *onerror, /* 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) && + if((method == SIGNAL_FIRST_METHOD || + method == SIGNAL_LAST_METHOD) && g_list_length(gtktypes) != g_list_length(funcargs) && !(g_list_length(funcargs) == 1 && g_list_length(gtktypes) == 2 && @@ -120,8 +123,24 @@ push_function(int scope, char *oid, char *id, char *onerror, "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); + if(cbuf) { + char *p; + c_cbuf = p = cbuf->str; + while(p && *p && (*p==' ' || *p=='\t' || *p=='\n' || *p=='\r')) + p++; + if(!p || !*p) + c_cbuf = NULL; + } else + c_cbuf = NULL; + + node = new_method(scope,method,type,oid,gtktypes,id,funcargs, + onerror,c_cbuf,line_no,ccode_line,vararg); + + if(cbuf) + g_string_free(cbuf, + /*only free segment if we haven't passed it + above */ + c_cbuf?FALSE:TRUE); gtktypes = NULL; funcargs = NULL; @@ -190,7 +209,7 @@ push_self(char *id) %token TOKEN NUMBER TYPETOKEN ARRAY_DIM %token CCODE HCODE -%token PUBLIC PRIVATE ARGUMENT VIRTUAL SIGNAL OVERRIDE +%token PUBLIC PRIVATE PROTECTED ARGUMENT VIRTUAL SIGNAL OVERRIDE %% @@ -201,20 +220,26 @@ prog: ccodes class ccodes { ; } ; ccodes: ccodes CCODE { - Node *node = new_ccode(FALSE,$2,ccode_line); + Node *node = new_ccode(FALSE,($2)->str, + ccode_line); nodes = g_list_append(nodes,node); + g_string_free($2,FALSE); } | ccodes HCODE { - Node *node = new_ccode(TRUE,$2,ccode_line); + Node *node = new_ccode(TRUE,($2)->str,ccode_line); nodes = g_list_append(nodes,node); + g_string_free($2,FALSE); } | CCODE { - Node *node = new_ccode(FALSE,$1,ccode_line); + Node *node = new_ccode(FALSE,($1)->str, + ccode_line); nodes = g_list_append(nodes,node); + g_string_free($1,FALSE); } | HCODE { - Node *node = new_ccode(TRUE,$1,ccode_line); + Node *node = new_ccode(TRUE,($1)->str,ccode_line); nodes = g_list_append(nodes,node); + g_string_free($1,FALSE); } ; @@ -243,18 +268,17 @@ classcode: classcode method { ; } | argument { ; } ; -variable: PUBLIC type TOKEN ';' { - push_variable($3,PUBLIC_SCOPE,$1,NULL); - } - | PUBLIC type TOKEN ARRAY_DIM ';' { - push_variable($3,PUBLIC_SCOPE,$1,$4); +scope: PUBLIC { the_scope = PUBLIC_SCOPE; } + | PRIVATE { the_scope = PRIVATE_SCOPE; } + | PROTECTED { the_scope = PROTECTED_SCOPE; } + ; + +variable: scope type TOKEN ';' { + push_variable($3,the_scope,$1,NULL); } - | PRIVATE type TOKEN ';' { - push_variable($3,PRIVATE_SCOPE,$1,NULL); + | scope type TOKEN ARRAY_DIM ';' { + push_variable($3,the_scope,$1,$4); } - | 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 && @@ -262,18 +286,22 @@ argument: ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { Node *node; g_free($5); g_free($8); node = new_argument($3,$2,$4, - $7,$6, - $10,$9, + ($7)->str,$6, + ($10)->str,$9, $1); + g_string_free($7,FALSE); + g_string_free($10,FALSE); class_nodes = g_list_append(class_nodes,node); } else if(strcmp($5,"set")==0 && strcmp($8,"get")==0) { Node *node; g_free($5); g_free($8); node = new_argument($3,$2,$4, - $10,$9, - $7,$6, + ($10)->str,$9, + ($7)->str,$6, $1); + g_string_free($10,FALSE); + g_string_free($7,FALSE); class_nodes = g_list_append(class_nodes,node); } else { g_free($3); g_free($4); @@ -290,15 +318,17 @@ argument: ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { Node *node; g_free($5); node = new_argument($3,$2,$4, - $7,$6,NULL,0, - $1); + ($7)->str,$6, + NULL,0, $1); + g_string_free($7,FALSE); class_nodes = g_list_append(class_nodes,node); } else if(strcmp($5,"set")==0) { Node *node; g_free($5); node = new_argument($3,$2,$4, - NULL,0,$7,$6, - $1); + NULL,0,($7)->str, + $6, $1); + g_string_free($7,FALSE); class_nodes = g_list_append(class_nodes,node); } else { g_free($5); g_free($3); @@ -415,38 +445,8 @@ stars: '*' stars { stars++; } | '*' { stars++; } ; -optpublic: { ; } - | PUBLIC { ; } - ; - -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 { +/* this never sets the_scope */ +simplesigtype: TOKEN sigtype { if(strcmp($1,"first")==0) $$ = SIGNAL_FIRST_METHOD; else if(strcmp($1,"last")==0) @@ -458,7 +458,13 @@ fullsigtype: PRIVATE TOKEN sigtype { } g_free($1); } - | PUBLIC TOKEN sigtype { + | sigtype { + $$ = SIGNAL_LAST_METHOD; + } + ; + +/* this always sets the_scope */ +fullsigtype: scope TOKEN sigtype { if(strcmp($2,"first")==0) $$ = SIGNAL_FIRST_METHOD; else if(strcmp($2,"last")==0) @@ -470,7 +476,7 @@ fullsigtype: PRIVATE TOKEN sigtype { } g_free($2); } - | TOKEN PUBLIC sigtype { + | TOKEN scope sigtype { if(strcmp($1,"first")==0) $$ = SIGNAL_FIRST_METHOD; else if(strcmp($1,"last")==0) @@ -482,11 +488,12 @@ fullsigtype: PRIVATE TOKEN sigtype { } g_free($1); } - | PUBLIC sigtype { + | scope sigtype { $$ = SIGNAL_LAST_METHOD; } - | sigtype { - $$ = SIGNAL_LAST_METHOD; + | simplesigtype { + /* the_scope was default thus public */ + the_scope = PUBLIC_SCOPE; } ; @@ -503,7 +510,7 @@ tokenlist: tokenlist ',' TOKEN { } ; -codenocode: '{' CCODE { $$=$2; } +codenocode: '{' CCODE { $$ = $2; } | ';' { $$ = NULL; } ; @@ -514,55 +521,70 @@ method: SIGNAL fullsigtype type TOKEN '(' funcargs ')' onerror codenocode { "first parameter")); YYERROR; } - push_function($2,NULL, + push_function(the_scope, $2,NULL, $4, $8, $9,$1, ccode_line,vararg); } - | VIRTUAL PRIVATE type TOKEN '(' funcargs ')' onerror codenocode { + | scope SIGNAL simplesigtype type TOKEN '(' funcargs ')' onerror codenocode { + if(!has_self) { + yyerror(_("signal without 'self' as " + "first parameter")); + YYERROR; + } + push_function(the_scope, $3,NULL, + $5, $9, $10,$2, + ccode_line,vararg); + } + | VIRTUAL scope type TOKEN '(' funcargs ')' onerror codenocode { if(!has_self) { yyerror(_("virtual method without 'self' as " "first parameter")); YYERROR; } - push_function(PRIVATE_VIRTUAL_METHOD, NULL, $4, + push_function(the_scope, VIRTUAL_METHOD, NULL, $4, $8, $9,$1, ccode_line,vararg); } - | VIRTUAL optpublic type TOKEN '(' funcargs ')' onerror codenocode { + | scope VIRTUAL type TOKEN '(' funcargs ')' onerror codenocode { if(!has_self) { yyerror(_("virtual method without 'self' as " "first parameter")); YYERROR; } - push_function(VIRTUAL_METHOD, NULL, $4, - $8, $9,$1, + push_function(the_scope, VIRTUAL_METHOD, NULL, $4, + $8, $9,$2, ccode_line,vararg); } - | OVERRIDE '(' TYPETOKEN ')' type TOKEN '(' funcargs ')' onerror '{' CCODE { - push_function(OVERRIDE_METHOD, $3, - $6, $10, $12, - $1,$11, - vararg); + | VIRTUAL type TOKEN '(' funcargs ')' onerror codenocode { + if(!has_self) { + yyerror(_("virtual method without 'self' as " + "first parameter")); + YYERROR; + } + push_function(PUBLIC_SCOPE, VIRTUAL_METHOD, NULL, + $3, $7, $8,$1, + ccode_line,vararg); } - | PUBLIC type TOKEN '(' funcargs ')' onerror '{' CCODE { - push_function(PUBLIC_SCOPE, NULL, $3, - $7, $9,$1,$8, + | OVERRIDE '(' TYPETOKEN ')' type TOKEN '(' funcargs ')' onerror codenocode { + push_function(NO_SCOPE, OVERRIDE_METHOD, $3, + $6, $10, $11, + $1,ccode_line, vararg); - } - | PRIVATE type TOKEN '(' funcargs ')' onerror '{' CCODE { - push_function(PRIVATE_SCOPE, NULL, $3, - $7, $9,$1,$8, + } + | scope type TOKEN '(' funcargs ')' onerror codenocode { + push_function(the_scope, REGULAR_METHOD, NULL, $3, + $7, $8,$1,ccode_line, vararg); } | TOKEN '(' TOKEN ')' codenocode { if(strcmp($1,"init")==0) { push_init_arg($3,FALSE); - push_function(INIT_METHOD, NULL, + push_function(NO_SCOPE, INIT_METHOD, NULL, $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, + push_function(NO_SCOPE, CLASS_INIT_METHOD, NULL, $1, NULL, $5,$2, ccode_line,FALSE); } else { @@ -580,7 +602,6 @@ onerror: ONERROR numtok { $$ = $2; } $$ = ($3)->str; g_string_free($3,FALSE); } - | '=' '1' { ; } | { $$ = NULL; } ;