same as the last commit
authorJordan <jordanlavatai@gmail.com>
Sun, 8 Jan 2017 00:05:41 +0000 (16:05 -0800)
committerJordan <jordanlavatai@gmail.com>
Sun, 8 Jan 2017 00:05:41 +0000 (16:05 -0800)
src/parser.y

index c1f15f4..537b230 100644 (file)
@@ -1,6 +1,11 @@
 /* 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;
@@ -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);
+}