X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/b9f22ab5a7f4d4bfe0932debf8864a21b5c852cd..refs/tags/v0.0.3:/src/parse.y diff --git a/src/parse.y b/src/parse.y index 5bb8bc3..b718cdc 100644 --- a/src/parse.y +++ b/src/parse.y @@ -47,6 +47,7 @@ static GList *gtktypes = NULL; void free(void *ptr); int yylex(void); +extern int ccode_line; extern int line_no; extern char *yytext; @@ -89,7 +90,7 @@ push_variable(char *name, int scope) static void push_function(int scope, char *oid, char *id, char *onerror, - GString *cbuf,int line_no) + GString *cbuf,int line_no, int ccode_line) { Node *node; Type *type; @@ -102,7 +103,7 @@ push_function(int scope, char *oid, char *id, char *onerror, } node = new_method(scope,type,oid,gtktypes,id,funcargs, - onerror,cbuf,line_no); + onerror,cbuf,line_no,ccode_line); gtktypes = NULL; funcargs = NULL; @@ -164,7 +165,7 @@ push_this(char *this) %token CLASS FROM %token VOID STRUCT UNION ENUM SIGNED UNSIGNED LONG SHORT INT FLOAT DOUBLE CHAR %token FIRST LAST -%token CHECK CNULL TYPE ONERROR +%token ONERROR %token TOKEN NUMBER TYPETOKEN %token CCODE HCODE @@ -179,19 +180,19 @@ prog: ccodes class ccodes { ; } ; ccodes: ccodes CCODE { - Node *node = new_ccode(FALSE,$2); + Node *node = new_ccode(FALSE,$2,ccode_line); nodes = g_list_append(nodes,node); } | ccodes HCODE { - Node *node = new_ccode(TRUE,$2); + Node *node = new_ccode(TRUE,$2,ccode_line); nodes = g_list_append(nodes,node); } | CCODE { - Node *node = new_ccode(FALSE,$1); + Node *node = new_ccode(FALSE,$1,ccode_line); nodes = g_list_append(nodes,node); } | HCODE { - Node *node = new_ccode(TRUE,$1); + Node *node = new_ccode(TRUE,$1,ccode_line); nodes = g_list_append(nodes,node); } ; @@ -229,14 +230,16 @@ argument: ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { Node *node; g_free($5); g_free($8); node = new_argument($3,$2,$4, - $7,$10); + $7,$6, + $10,$9); 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,$7); + $10,$9, + $7,$6); class_nodes = g_list_append(class_nodes,node); } else { g_free($3); g_free($4); @@ -253,13 +256,13 @@ argument: ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { Node *node; g_free($5); node = new_argument($3,$2,$4, - $7,NULL); + $7,$6,NULL,0); 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,$7); + NULL,0,$7,$6); class_nodes = g_list_append(class_nodes,node); } else { g_free($5); g_free($3); @@ -381,41 +384,46 @@ tokenlist: tokenlist ',' TOKEN { ; /*here CCODE will include the ending '}' */ -method: SIGNAL LAST sigtype type TOKEN '(' funcargs ')' onerror '{' CCODE { - if(!has_this) { - yyerror(_("signal without 'this' as " - "first parameter")); +method: SIGNAL TOKEN sigtype type TOKEN '(' funcargs ')' onerror '{' CCODE { + 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; } - push_function(SIGNAL_LAST_METHOD,NULL, - $5, $9, $11,$1); - } - | SIGNAL LAST sigtype type TOKEN '(' funcargs ')' onerror ';' { + g_free($2); + if(!has_this) { yyerror(_("signal without 'this' as " "first parameter")); YYERROR; } - push_function(SIGNAL_LAST_METHOD, NULL, - $5, $9, NULL,$1); + push_function(sigtype,NULL, + $5, $9, $11,$1,$10); } - | SIGNAL FIRST sigtype type TOKEN '(' funcargs ')' onerror '{' CCODE { - if(!has_this) { - yyerror(_("signal without 'this' as " - "first parameter")); + | SIGNAL TOKEN sigtype type TOKEN '(' funcargs ')' onerror ';' { + 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; } - push_function(SIGNAL_FIRST_METHOD, NULL, - $5, $9, $11,$1); - } - | SIGNAL FIRST sigtype type TOKEN '(' funcargs ')' onerror ';' { + g_free($2); if(!has_this) { yyerror(_("signal without 'this' as " "first parameter")); YYERROR; } - push_function(SIGNAL_FIRST_METHOD, NULL, $5, - $9, NULL,$1); + push_function(sigtype, NULL, + $5, $9, NULL,$1,0); } | SIGNAL sigtype type TOKEN '(' funcargs ')' onerror '{' CCODE { if(!has_this) { @@ -424,7 +432,7 @@ method: SIGNAL LAST sigtype type TOKEN '(' funcargs ')' onerror '{' CCODE { YYERROR; } push_function(SIGNAL_LAST_METHOD, NULL, - $4, $8, $10,$1); + $4, $8, $10,$1,$9); } | SIGNAL sigtype type TOKEN '(' funcargs ')' onerror ';' { if(!has_this) { @@ -433,37 +441,37 @@ method: SIGNAL LAST sigtype type TOKEN '(' funcargs ')' onerror '{' CCODE { YYERROR; } push_function(SIGNAL_LAST_METHOD, NULL, $4, - $8, NULL,$1); + $8, NULL,$1,0); } | VIRTUAL type TOKEN '(' funcargs ')' onerror '{' CCODE { push_function(VIRTUAL_METHOD, NULL, $3, - $7, $9,$1); + $7, $9,$1,$8); } | VIRTUAL type TOKEN '(' funcargs ')' onerror ';' { push_function(VIRTUAL_METHOD, NULL, $3, - $7, NULL,$1); + $7, NULL,$1,0); } | OVERRIDE '(' TYPETOKEN ')' type TOKEN '(' funcargs ')' onerror '{' CCODE { push_function(OVERRIDE_METHOD, $3, - $6, $10, $12,$1); + $6, $10, $12,$1,$11); } | PUBLIC type TOKEN '(' funcargs ')' onerror '{' CCODE { push_function(PUBLIC_SCOPE, NULL, $3, - $7, $9,$1); + $7, $9,$1,$8); } | PRIVATE type TOKEN '(' funcargs ')' onerror '{' CCODE { push_function(PRIVATE_SCOPE, NULL, $3, - $7, $9,$1); + $7, $9,$1,$8); } | TOKEN '(' TOKEN ')' ';' { if(strcmp($1,"init")==0) { push_init_arg($3,FALSE); push_function(INIT_METHOD, NULL, $1, - NULL, NULL,$2); + NULL, NULL,$2,0); } else if(strcmp($1,"class_init")==0) { push_init_arg($3,TRUE); push_function(CLASS_INIT_METHOD, NULL, - $1, NULL, NULL,$2); + $1, NULL, NULL,$2,0); } else { g_free($1); g_free($3); @@ -475,11 +483,13 @@ method: SIGNAL LAST sigtype type TOKEN '(' funcargs ')' onerror '{' CCODE { if(strcmp($1,"init")==0) { push_init_arg($3,FALSE); push_function(INIT_METHOD, NULL, - $1, NULL, $6,$2); + $1, NULL, $6,$2, + $5); } else if(strcmp($1,"class_init")==0) { push_init_arg($3,TRUE); push_function(CLASS_INIT_METHOD, NULL, - $1, NULL, $6,$2); + $1, NULL, $6,$2, + $5); } else { g_free($1); g_free($3); @@ -533,7 +543,12 @@ arglist: arglist ',' arg { ; } arg: type TOKEN { push_funcarg($2); } - | type TOKEN '(' CHECK checklist ')' { + | type TOKEN '(' TOKEN checklist ')' { + if(strcmp($4,"check")!=0) { + yyerror(_("parse error")); + YYERROR; + } + g_free($4); push_funcarg($2); } ; @@ -542,13 +557,18 @@ checklist: checklist check { ; } | check { ; } ; -check: CNULL { - Node *node = new_check(NULL_CHECK,NULL); - checks = g_list_append(checks,node); - } - | TYPE { - Node *node = new_check(TYPE_CHECK,NULL); - checks = g_list_append(checks,node); +check: TOKEN { + if(strcmp($1,"type")==0) { + Node *node = new_check(TYPE_CHECK,NULL); + checks = g_list_append(checks,node); + } else if(strcmp($1,"null")==0) { + Node *node = new_check(NULL_CHECK,NULL); + checks = g_list_append(checks,node); + } else { + yyerror(_("parse error")); + YYERROR; + } + g_free($1); } | '>' number { Node *node = new_check(GT_CHECK,$2);