X-Git-Url: http://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/2255b3d84eeb947d4c065332f16e410ae4704c63..e10d6e307623d0952f6e1f5d9fee8720ddab4808:/src/parse.y diff --git a/src/parse.y b/src/parse.y index f4c4a40..a6892e9 100644 --- a/src/parse.y +++ b/src/parse.y @@ -27,11 +27,10 @@ #include "tree.h" #include "main.h" +#include "util.h" #define _(x) (x) -extern char *filename; - GList *nodes = NULL; static GList *class_nodes = NULL; @@ -83,12 +82,19 @@ yyerror(char *str) exit(1); } +static Type * +pop_type(void) +{ + Type *type = typestack->data; + typestack = g_list_remove(typestack,typestack->data); + return type; +} + static void push_variable(char *name, int scope, int line_no, char *postfix) { Node *var; - Type *type = typestack->data; - typestack = g_list_remove(typestack,typestack->data); + Type *type = pop_type(); type->postfix = postfix; @@ -105,8 +111,7 @@ push_function(int scope, int method, char *oid, char *id, char *onerror, char *c_cbuf; if(method!=INIT_METHOD && method!=CLASS_INIT_METHOD) { - type = typestack->data; - typestack = g_list_remove(typestack,typestack->data); + type = pop_type(); } else { type = (Type *)new_type(0,g_strdup("void"),NULL); } @@ -151,8 +156,7 @@ static void push_funcarg(char *name, char *postfix) { Node *node; - Type *type = typestack->data; - typestack = g_list_remove(typestack,typestack->data); + Type *type = pop_type(); type->postfix = postfix; @@ -208,7 +212,7 @@ push_self(char *id) %token ONERROR %token TOKEN NUMBER TYPETOKEN ARRAY_DIM -%token CCODE HCODE +%token CCODE HTCODE PHCODE HCODE %token PUBLIC PRIVATE PROTECTED ARGUMENT VIRTUAL SIGNAL OVERRIDE %% @@ -219,30 +223,36 @@ prog: ccodes class ccodes { ; } | class { ; } ; -ccodes: ccodes CCODE { - Node *node = new_ccode(FALSE,($2)->str, +ccode: CCODE { + Node *node = new_ccode(C_CCODE,($1)->str, ccode_line); nodes = g_list_append(nodes,node); - g_string_free($2,FALSE); + g_string_free($1,FALSE); } - | ccodes HCODE { - Node *node = new_ccode(TRUE,($2)->str,ccode_line); + | HCODE { + Node *node = new_ccode(H_CCODE,($1)->str, + ccode_line); nodes = g_list_append(nodes,node); - g_string_free($2,FALSE); + g_string_free($1,FALSE); } - | CCODE { - Node *node = new_ccode(FALSE,($1)->str, + | HTCODE { + Node *node = new_ccode(HT_CCODE,($1)->str, ccode_line); nodes = g_list_append(nodes,node); g_string_free($1,FALSE); } - | HCODE { - Node *node = new_ccode(TRUE,($1)->str,ccode_line); + | PHCODE { + Node *node = new_ccode(PH_CCODE,($1)->str, + ccode_line); nodes = g_list_append(nodes,node); g_string_free($1,FALSE); } ; +ccodes: ccodes ccode { ; } + | ccode { ; } + ; + class: classdec '{' classcode '}' { ((Class *)class)->nodes = class_nodes; class_nodes = NULL; @@ -280,12 +290,13 @@ variable: scope type TOKEN ';' { push_variable($3,the_scope,$1,$4); } ; -argument: ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { +argument: ARGUMENT argflags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { if(strcmp($5,"get")==0 && strcmp($8,"set")==0) { Node *node; + Type *type = pop_type(); g_free($5); g_free($8); - node = new_argument($3,$2,$4, + node = new_argument($3,type,$2,$4, ($7)->str,$6, ($10)->str,$9, $1); @@ -295,8 +306,9 @@ argument: ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { } else if(strcmp($5,"set")==0 && strcmp($8,"get")==0) { Node *node; + Type *type = pop_type(); g_free($5); g_free($8); - node = new_argument($3,$2,$4, + node = new_argument($3,type,$2,$4, ($10)->str,$9, ($7)->str,$6, $1); @@ -313,19 +325,21 @@ argument: ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { YYERROR; } } - | ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE ';' { + | ARGUMENT argflags argtype TOKEN TOKEN '{' CCODE ';' { if(strcmp($5,"get")==0) { Node *node; + Type *type = pop_type(); g_free($5); - node = new_argument($3,$2,$4, + node = new_argument($3,type,$2,$4, ($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; + Type *type = pop_type(); g_free($5); - node = new_argument($3,$2,$4, + node = new_argument($3,type,$2,$4, NULL,0,($7)->str, $6, $1); g_string_free($7,FALSE); @@ -340,6 +354,21 @@ argument: ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { } } ; + +argtype: TOKEN '(' TOKEN type ')' { + if(strcmp($3,"type")!=0) { + g_free($1); + g_free($3); + yyerror(_("parse error")); + YYERROR; + } + $$ = $1; + } + | TOKEN { + $$ = $1; + typestack = g_list_prepend(typestack,NULL); + } + ; argflags: '(' flaglist ')' { $$ = $2; } | { $$ = NULL; }