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;
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);
}
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;
push_variable($<id>3,the_scope,$<line>1,$<id>4);
}
;
-argument: ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' {
+argument: ARGUMENT argflags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' {
if(strcmp($<id>5,"get")==0 &&
strcmp($<id>8,"set")==0) {
Node *node;
+ Type *type = pop_type();
g_free($<id>5); g_free($<id>8);
- node = new_argument($<id>3,$<list>2,$<id>4,
+ node = new_argument($<id>3,type,$<list>2,$<id>4,
($<cbuf>7)->str,$<line>6,
($<cbuf>10)->str,$<line>9,
$<line>1);
} else if(strcmp($<id>5,"set")==0 &&
strcmp($<id>8,"get")==0) {
Node *node;
+ Type *type = pop_type();
g_free($<id>5); g_free($<id>8);
- node = new_argument($<id>3,$<list>2,$<id>4,
+ node = new_argument($<id>3,type,$<list>2,$<id>4,
($<cbuf>10)->str,$<line>9,
($<cbuf>7)->str,$<line>6,
$<line>1);
YYERROR;
}
}
- | ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE ';' {
+ | ARGUMENT argflags argtype TOKEN TOKEN '{' CCODE ';' {
if(strcmp($<id>5,"get")==0) {
Node *node;
+ Type *type = pop_type();
g_free($<id>5);
- node = new_argument($<id>3,$<list>2,$<id>4,
+ node = new_argument($<id>3,type,$<list>2,$<id>4,
($<cbuf>7)->str,$<line>6,
NULL,0, $<line>1);
g_string_free($<cbuf>7,FALSE);
class_nodes = g_list_append(class_nodes,node);
} else if(strcmp($<id>5,"set")==0) {
Node *node;
+ Type *type = pop_type();
g_free($<id>5);
- node = new_argument($<id>3,$<list>2,$<id>4,
+ node = new_argument($<id>3,type,$<list>2,$<id>4,
NULL,0,($<cbuf>7)->str,
$<line>6, $<line>1);
g_string_free($<cbuf>7,FALSE);
}
}
;
+
+argtype: TOKEN '(' TOKEN type ')' {
+ if(strcmp($<id>3,"type")!=0) {
+ g_free($<id>1);
+ g_free($<id>3);
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ $<id>$ = $<id>1;
+ }
+ | TOKEN {
+ $<id>$ = $<id>1;
+ typestack = g_list_prepend(typestack,NULL);
+ }
+ ;
argflags: '(' flaglist ')' { $<list>$ = $<list>2; }
| { $<list>$ = NULL; }