From 91df32369f5391048ef9ef6566ea17c97174f5d9 Mon Sep 17 00:00:00 2001 From: Jordan Date: Sat, 7 Jan 2017 16:05:41 -0800 Subject: [PATCH] same as the last commit --- src/parser.y | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/src/parser.y b/src/parser.y index c1f15f4..537b230 100644 --- a/src/parser.y +++ b/src/parser.y @@ -1,6 +1,11 @@ /* Asset Package Compiler */ + %code requires { #include + typedef struct class_state_t yycstate; + + yycstate* yycstate_new(void); + void yycstate_delete(yycstate*); } %{ @@ -10,14 +15,19 @@ #include #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); @@ -25,11 +35,14 @@ #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; @@ -179,3 +192,32 @@ ir_class class_stack_push } 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); + +} -- 2.18.0