X-Git-Url: http://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/daead564b9592e78d418deb56a211cd5ea399f76..64034bc2613afefb289d1450411e69a0de4bce4e:/src/parse.y diff --git a/src/parse.y b/src/parse.y index 6e17c96..449ef3c 100644 --- a/src/parse.y +++ b/src/parse.y @@ -42,6 +42,7 @@ static int stars = 0; static GList *funcargs = NULL; static GList *checks = NULL; static int has_self = FALSE; +static int vararg = FALSE; static GList *gtktypes = NULL; @@ -91,7 +92,7 @@ push_variable(char *name, int scope, int line_no) static void push_function(int scope, char *oid, char *id, char *onerror, - GString *cbuf,int line_no, int ccode_line) + GString *cbuf,int line_no, int ccode_line, int vararg) { Node *node; Type *type; @@ -104,7 +105,7 @@ push_function(int scope, char *oid, char *id, char *onerror, } node = new_method(scope,type,oid,gtktypes,id,funcargs, - onerror,cbuf,line_no,ccode_line); + onerror,cbuf,line_no,ccode_line,vararg); gtktypes = NULL; funcargs = NULL; @@ -164,8 +165,8 @@ push_self(char *id) } %token CLASS FROM -%token VOID STRUCT UNION ENUM SIGNED UNSIGNED LONG SHORT INT FLOAT DOUBLE CHAR -%token FIRST LAST +%token CONST VOID STRUCT UNION ENUM THREEDOTS +%token SIGNED UNSIGNED LONG SHORT INT FLOAT DOUBLE CHAR %token ONERROR %token TOKEN NUMBER TYPETOKEN @@ -293,18 +294,27 @@ flaglist: TOKEN '|' flaglist { ; -type: type1 { +type: type1 { ; } + | CONST type1 { + Type *type = typestack->data; + char *oldname = type->name; + type->name = g_strconcat("const ",oldname,NULL); + g_free(oldname); + } + ; + +type1: type2 { Node *node = new_type(0,$1); typestack = g_list_prepend(typestack,node); } - | type1 stars { + | type2 stars { Node *node = new_type(stars,$1); stars = 0; typestack = g_list_prepend(typestack,node); } ; -type1: UNSIGNED integer { +type2: UNSIGNED integer { $$ = g_strconcat("unsigned ",$2,NULL); } | SIGNED integer { @@ -412,7 +422,8 @@ method: SIGNAL TOKEN sigtype type TOKEN '(' funcargs ')' onerror codenocode { YYERROR; } push_function(sigtype,NULL, - $5, $9, $10,$1,ccode_line); + $5, $9, $10,$1, + ccode_line,vararg); } | SIGNAL sigtype type TOKEN '(' funcargs ')' onerror codenocode { if(!has_self) { @@ -421,7 +432,8 @@ method: SIGNAL TOKEN sigtype type TOKEN '(' funcargs ')' onerror codenocode { YYERROR; } push_function(SIGNAL_LAST_METHOD, NULL, - $4, $8, $9,$1,ccode_line); + $4, $8, $9,$1, + ccode_line,vararg); } | VIRTUAL type TOKEN '(' funcargs ')' onerror codenocode { if(!has_self) { @@ -430,29 +442,36 @@ method: SIGNAL TOKEN sigtype type TOKEN '(' funcargs ')' onerror codenocode { YYERROR; } push_function(VIRTUAL_METHOD, NULL, $3, - $7, $8,$1,ccode_line); + $7, $8,$1, + ccode_line,vararg); } | OVERRIDE '(' TYPETOKEN ')' type TOKEN '(' funcargs ')' onerror '{' CCODE { push_function(OVERRIDE_METHOD, $3, - $6, $10, $12,$1,$11); + $6, $10, $12, + $1,$11, + vararg); } | PUBLIC type TOKEN '(' funcargs ')' onerror '{' CCODE { push_function(PUBLIC_SCOPE, NULL, $3, - $7, $9,$1,$8); + $7, $9,$1,$8, + vararg); } | PRIVATE type TOKEN '(' funcargs ')' onerror '{' CCODE { push_function(PRIVATE_SCOPE, NULL, $3, - $7, $9,$1,$8); + $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); + 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); + $1, NULL, NULL,$2,0, + FALSE); } else { g_free($1); g_free($3); @@ -465,12 +484,12 @@ method: SIGNAL TOKEN sigtype type TOKEN '(' funcargs ')' onerror codenocode { push_init_arg($3,FALSE); push_function(INIT_METHOD, NULL, $1, NULL, $6,$2, - $5); + $5,FALSE); } else if(strcmp($1,"class_init")==0) { push_init_arg($3,TRUE); push_function(CLASS_INIT_METHOD, NULL, $1, NULL, $6,$2, - $5); + $5,FALSE); } else { g_free($1); g_free($3); @@ -490,8 +509,6 @@ onerror: ONERROR numtok { $$ = $2; } | { $$ = NULL; } ; - - funcargs: VOID { has_self = FALSE; } | TOKEN { has_self = TRUE; @@ -525,8 +542,12 @@ funcargs: VOID { has_self = FALSE; } } | arglist { has_self = FALSE; } ; + +arglist: arglist1 ',' THREEDOTS { vararg = TRUE; } + | arglist1 { vararg = FALSE; } + ; -arglist: arglist ',' arg { ; } +arglist1: arglist1 ',' arg { ; } | arg { ; } ;