X-Git-Url: http://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/f319f19a8ef9c6d076359ed4bbbc42cdecefc0f0..daead564b9592e78d418deb56a211cd5ea399f76:/src/parse.y diff --git a/src/parse.y b/src/parse.y index 77e5692..6e17c96 100644 --- a/src/parse.y +++ b/src/parse.y @@ -26,6 +26,7 @@ #include #include "tree.h" +#include "main.h" #define _(x) (x) @@ -40,7 +41,7 @@ static GList *typestack = NULL; static int stars = 0; static GList *funcargs = NULL; static GList *checks = NULL; -static int has_this = FALSE; +static int has_self = FALSE; static GList *gtktypes = NULL; @@ -78,13 +79,13 @@ yyerror(char *str) } static void -push_variable(char *name, int scope) +push_variable(char *name, int scope, int line_no) { Node *var; Type *type = typestack->data; typestack = g_list_remove(typestack,typestack->data); - var = new_variable(scope,type,name); + var = new_variable(scope,type,name,line_no); class_nodes = g_list_append(class_nodes, var); } @@ -141,7 +142,7 @@ push_init_arg(char *name, int is_class) } static void -push_this(char *this) +push_self(char *id) { Node *node; Node *type; @@ -149,7 +150,7 @@ push_this(char *this) type = new_type(1,g_strdup(((Class *)class)->otype)); 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,this,ch); + node = new_funcarg((Type *)type,id,ch); funcargs = g_list_prepend(funcargs, node); } @@ -218,10 +219,10 @@ classcode: classcode method { ; } ; variable: PUBLIC type TOKEN ';' { - push_variable($3,PUBLIC_SCOPE); + push_variable($3,PUBLIC_SCOPE,$1); } | PRIVATE type TOKEN ';' { - push_variable($3,PRIVATE_SCOPE); + push_variable($3,PRIVATE_SCOPE,$1); } ; argument: ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { @@ -231,7 +232,8 @@ argument: ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { g_free($5); g_free($8); node = new_argument($3,$2,$4, $7,$6, - $10,$9); + $10,$9, + $1); class_nodes = g_list_append(class_nodes,node); } else if(strcmp($5,"set")==0 && strcmp($8,"get")==0) { @@ -239,7 +241,8 @@ argument: ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { g_free($5); g_free($8); node = new_argument($3,$2,$4, $10,$9, - $7,$6); + $7,$6, + $1); class_nodes = g_list_append(class_nodes,node); } else { g_free($3); g_free($4); @@ -256,13 +259,15 @@ argument: ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { Node *node; g_free($5); node = new_argument($3,$2,$4, - $7,$6,NULL,0); + $7,$6,NULL,0, + $1); 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); + NULL,0,$7,$6, + $1); class_nodes = g_list_append(class_nodes,node); } else { g_free($5); g_free($3); @@ -383,8 +388,12 @@ tokenlist: tokenlist ',' TOKEN { } ; +codenocode: '{' CCODE { $$=$2; } + | ';' { $$ = NULL; } + ; + /*here CCODE will include the ending '}' */ -method: SIGNAL TOKEN sigtype type TOKEN '(' funcargs ')' onerror '{' CCODE { +method: SIGNAL TOKEN sigtype type TOKEN '(' funcargs ')' onerror codenocode { int sigtype = SIGNAL_LAST_METHOD; if(strcmp($2,"first")==0) sigtype = SIGNAL_FIRST_METHOD; @@ -397,59 +406,31 @@ method: SIGNAL TOKEN sigtype type TOKEN '(' funcargs ')' onerror '{' CCODE { } g_free($2); - if(!has_this) { - yyerror(_("signal without 'this' as " + if(!has_self) { + yyerror(_("signal without 'self' as " "first parameter")); YYERROR; } push_function(sigtype,NULL, - $5, $9, $11,$1,$10); + $5, $9, $10,$1,ccode_line); } - | 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; - } - g_free($2); - if(!has_this) { - yyerror(_("signal without 'this' as " - "first parameter")); - YYERROR; - } - push_function(sigtype, NULL, - $5, $9, NULL,$1,0); - } - | SIGNAL sigtype type TOKEN '(' funcargs ')' onerror '{' CCODE { - if(!has_this) { - yyerror(_("signal without 'this' as " + | SIGNAL sigtype type TOKEN '(' funcargs ')' onerror codenocode { + if(!has_self) { + yyerror(_("signal without 'self' as " "first parameter")); YYERROR; } push_function(SIGNAL_LAST_METHOD, NULL, - $4, $8, $10,$1,$9); + $4, $8, $9,$1,ccode_line); } - | SIGNAL sigtype type TOKEN '(' funcargs ')' onerror ';' { - if(!has_this) { - yyerror(_("signal without 'this' as " + | VIRTUAL type TOKEN '(' funcargs ')' onerror codenocode { + if(!has_self) { + yyerror(_("virtual method without 'self' as " "first parameter")); YYERROR; } - push_function(SIGNAL_LAST_METHOD, NULL, $4, - $8, NULL,$1,0); - } - | VIRTUAL type TOKEN '(' funcargs ')' onerror '{' CCODE { - push_function(VIRTUAL_METHOD, NULL, $3, - $7, $9,$1,$8); - } - | VIRTUAL type TOKEN '(' funcargs ')' onerror ';' { push_function(VIRTUAL_METHOD, NULL, $3, - $7, NULL,$1,0); + $7, $8,$1,ccode_line); } | OVERRIDE '(' TYPETOKEN ')' type TOKEN '(' funcargs ')' onerror '{' CCODE { push_function(OVERRIDE_METHOD, $3, @@ -511,11 +492,16 @@ onerror: ONERROR numtok { $$ = $2; } -funcargs: VOID { has_this = FALSE; } +funcargs: VOID { has_self = FALSE; } | TOKEN { - has_this = TRUE; - if(strcmp($1,"this")==0) - push_this($1); + 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) + push_self($1); else { g_free($1); yyerror(_("parse error")); @@ -523,16 +509,21 @@ funcargs: VOID { has_this = FALSE; } } } | TOKEN ',' arglist { - has_this = TRUE; - if(strcmp($1,"this")==0) - push_this($1); + 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) + push_self($1); else { g_free($1); yyerror(_("parse error")); YYERROR; } } - | arglist { has_this = FALSE; } + | arglist { has_self = FALSE; } ; arglist: arglist ',' arg { ; }