#include "tree.h"
#include "main.h"
+#include "util.h"
#define _(x) (x)
-extern char *filename;
-
GList *nodes = NULL;
static GList *class_nodes = NULL;
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;
%token ONERROR
%token <id> TOKEN NUMBER TYPETOKEN ARRAY_DIM
-%token <cbuf> CCODE HCODE
+%token <cbuf> CCODE HTCODE PHCODE HCODE
%token <line> PUBLIC PRIVATE PROTECTED ARGUMENT VIRTUAL SIGNAL OVERRIDE
%%
| class { ; }
;
-ccodes: ccodes CCODE {
- Node *node = new_ccode(FALSE,($<cbuf>2)->str,
+ccode: CCODE {
+ Node *node = new_ccode(C_CCODE,($<cbuf>1)->str,
ccode_line);
nodes = g_list_append(nodes,node);
- g_string_free($<cbuf>2,FALSE);
+ g_string_free($<cbuf>1,FALSE);
}
- | ccodes HCODE {
- Node *node = new_ccode(TRUE,($<cbuf>2)->str,ccode_line);
+ | HCODE {
+ Node *node = new_ccode(H_CCODE,($<cbuf>1)->str,
+ ccode_line);
nodes = g_list_append(nodes,node);
- g_string_free($<cbuf>2,FALSE);
+ g_string_free($<cbuf>1,FALSE);
}
- | CCODE {
- Node *node = new_ccode(FALSE,($<cbuf>1)->str,
+ | HTCODE {
+ Node *node = new_ccode(HT_CCODE,($<cbuf>1)->str,
ccode_line);
nodes = g_list_append(nodes,node);
g_string_free($<cbuf>1,FALSE);
}
- | HCODE {
- Node *node = new_ccode(TRUE,($<cbuf>1)->str,ccode_line);
+ | PHCODE {
+ Node *node = new_ccode(PH_CCODE,($<cbuf>1)->str,
+ ccode_line);
nodes = g_list_append(nodes,node);
g_string_free($<cbuf>1,FALSE);
}
;
+ccodes: ccodes ccode { ; }
+ | ccode { ; }
+ ;
+
class: classdec '{' classcode '}' {
((Class *)class)->nodes = class_nodes;
class_nodes = NULL;
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; }