/* Asset Package Compiler */
+
%code requires {
#include <unitypes.h>
+ typedef struct class_state_t yycstate;
+
+ yycstate* yycstate_new(void);
+ void yycstate_delete(yycstate*);
}
%{
#include <unitypes.h>
#include "ir.h"
+ struct class_state_t {
+ ir_class *csp;
+ size_t class_stack_size;
+ ir_class *class_stack;
+
+ };
+
struct frame_spec_t { enum facing d; int w, h; };
extern long sys_pagesize;
extern int lexer();
static void yyerror(char const*);
/* Stack-based class handler */
- static ir_class *class_stack, *csp;
- static size_t class_stack_size;
static ir_class class_stack_init(void);
#define class_stack_pop() (*--csp)
static ir_class class_stack_push(ir_class);
#define yylex lexer
#define yyclass (*csp)
#define yyclassld (ir_classld_from_class(yyclass))
+
+
%}
%define parse.error verbose
%define lr.type ielr
%define api.pure full
%define api.push-pull push
+%parse-param {yycstate* cs}
%union {
long long ref;
int val;
}
return (*csp++ = class);
}
+
+yycstate*
+yycstate_new
+( void )
+{ yycstate* class_state;
+
+ class_state = (yycstate*) malloc((size_t) sys_pagesize);
+
+ if(class_state == NULL)
+ { yyerror(ERR_MEM);
+ exit(1);
+ }
+
+ class_state.class_stack = class_stack;
+ class_state.csp = class_state.class_stack;
+ class_state.class_stack_size = (size_t) sys_pagesize;
+ class_stack_push(ir_class_root());
+
+ return class_state;
+
+}
+
+void
+yycstate_delete
+( yycstate* class_state )
+{
+ free(class_state);
+
+}