pushing to debug make
authorjordan@hack_attack <jordanlavatai@gmail.com>
Tue, 30 Aug 2016 18:49:20 +0000 (11:49 -0700)
committerjordan@hack_attack <jordanlavatai@gmail.com>
Tue, 30 Aug 2016 18:49:20 +0000 (11:49 -0700)
src/apc/ir.c
src/apc/ir.h
src/apc/parser.y

index 10aede8..ffc1020 100644 (file)
@@ -1,28 +1,22 @@
 #include <errno.h>
-#include <ir.h>
+#include <ir.h> 
 
-#define CURR_OBI (OB[obi])
-#define CURR_VBI (VB[vbi])
-#define CURR_CBI (CB[cbi])
-#define IS_SUBCLASS() (CB[cbi].num_subclasses)
+//#define CURR_ODAT (OB[obi])
+//#define CURR_VDAT (VB[vbi])
+//#define CURR_CDAT (CB[cbi])
 
 //TODO: label and vdat_id
 void
 insert_set()
 {
-  if(IS_SUBCLASS()) //if set is set of subclass
-    OB[obi].class_id = CB[cbi].subclass_list[subclass_index].label; //TODO: specify subclass other than label?
-  else
-    OB[obi].class_id = CB[cbi].label;
-
-  CB[cbi].set_list[set_index].odat_id = obi;
-  CB[cbi].set_list[set_index].parent_id = OB[obi].class_id;
+  cdat_buf[cbi].set_list[set_index].odat_id = obi;
+  cdat_buf[cbi].set_list[set_index].parent_id =//from lexer
   //TODO: add ele_stack is created in element_list
-  //TODO: add odat
+  //TODO: add set to odat_buf
 
 }
 
-#define CURR_QUAD (OB[obi].ref_list[ref_index])
+#define CURR_QUAD (odat_buf[obi].ref_list[ref_index])
 void
 insert_ref(int x, int y, int z, int ref)
 {
@@ -33,28 +27,29 @@ insert_ref(int x, int y, int z, int ref)
 }
 
 
-//Insert element into OB and CB
+//Insert element into odat_buf and cdat_buf
 void
 insert_ele(char* label, int vdat_id)
 {
 
 
-  OB[obi].label = label;
-  OB[obi].vdat_id = vdat_id;
+  odat_buf[obi].label = label;
+  odat_buf[obi].vdat_id = vdat_id;
   //TODO: check set_obi to see if set_map_data exists
-  OB[obi].num_ref = OB[set_obi].num_ref;
-  OB[obi].ref_list = OB[set_obi].ref_list;
-  OB[obi].class_id = cbi;
+  //comes from e
+  odat_buf[obi].num_ref = odat_buf[set_obi].num_ref;
+  odat_buf[obi].ref_list = odat_buf[set_obi].ref_list;
+  odat_buf[obi].class_id = cbi;
 
   if(IS_SUBCLASS())
     {
-      CB[cbi].subclass_list[subclass_index].set_list[set_index].ele_list[ele_index].odat_id = obi;
-      CB[cbi].subclass_list[subclass_index].set_list[set_index].ele_list[ele_index].parent_id = CB[cbi].subclass_list[subclass_index].set_index;
+      cdat_buf[cbi].subclass_list[subclass_index].set_list[set_index].ele_list[ele_index].odat_id = obi;
+      cdat_buf[cbi].subclass_list[subclass_index].set_list[set_index].ele_list[ele_index].parent_id = cdat_buf[cbi].subclass_list[subclass_index].set_index;
     }
   else
     {
-      CB[cbi].set_list[set_index].ele_list[ele_index].odat_id = obi;
-      CB[cbi].set_list[set_index].ele_list[ele_index].parent_id = CB[cbi].set_index;
+      cdat_buf[cbi].set_list[set_index].ele_list[ele_index].odat_id = obi;
+      cdat_buf[cbi].set_list[set_index].ele_list[ele_index].parent_id = cdat_buf[cbi].set_index;
     }
 
   obi++;
@@ -65,8 +60,8 @@ insert_ele(char* label, int vdat_id)
 int
 insert_fdat(char* label, char direction, int fd)
 {
-  VB[vbi].model_list[VB[vbi].len].label = label;
-  VB[vbi].model_list[VB[vbi].len].fdat_id[(int)direction] = fd;
+  vdat_buf[vbi].model_list[vdat_buf[vbi].len].label = label;
+  vdat_buf[vbi].model_list[vdat_buf[vbi].len].fdat_id[(int)direction] = fd;
 }
 
 void
@@ -93,7 +88,7 @@ condense()
   /* fwrite vdat */
   for(v = 0; v <= vbi; v++)
     {
-      num_models = VB[v].num_models; //data duplication for caching
+      num_models = vdat_buf[v].num_models; //data duplication for caching
       for(m = 0; m <= num_models; m++)
         {
             
@@ -107,4 +102,47 @@ condense()
 
 
 }
+void
+inc_cbi()
+{
+  cbi++;
+}
+
+void
+set_class_label(char* label)
+{
+  cdat_buf[cbi].label = $1;
+}
+
+void
+inc_subclass_idx()
+{
+  cdat_buf[cbi].subclass_index++;
+}
+
+void
+inc_set_index()
+{
+  odat_buf[cbi].set_index++;
+}
+
+void
+inc_ref()
+{
+  odat_buf[obi].ref_index++;
+  odat_buf[obi].num_ref++;
+}
+
+//TODO: This needs to be changed to account for
+//      when the set is of a subclass.
+void
+inc_ele()
+{
+  cdat_buf[cbi].set_stack[stack_index].num_ele++;
+}
 
+void
+inc_models()
+{
+  vdat_buf[vbi].num_models++;
+}
index d4ab90b..9b8f4ab 100644 (file)
@@ -1,48 +1,29 @@
 /* Structures allocated for and updated during parse time that
    are the IR before writing to the output file */
 
-#define BUFF_SIZE 256
+#define BUF_SIZE 256
 #define MAX_SUBCLASSES 16
 #define MAX_SETS 256
 #define MAX_ELES 256
 #define MAX_REFS 256
 #define MAX_MODELS 256
 
-//These IR buffers will be condensed into their respective output files.
-//parse_init() all to zero.
-struct cdat CB[BUFF_SIZE];
-struct vdat VB[BUFF_SIZE];
-struct odat OB[BUFF_SIZE];
 
 //indexes for buffers
 int cbi = 0;
 int vbi = 0;
 int obi = 0;
 
-struct cdat {
-  char label[32];
-  int num_subclasses;
-  int num_sets;
-  int subclass_index;
-  int set_index;
-  struct cdat subclass_list[MAX_SUBCLASSES];
-  struct set set_list[MAX_SETS];
-};
-
-//Element or a set
-struct odat {
-  char label[32];
-  int vdat_id;
-  int class_id;
-  int num_ref;
-  int ref_index;
-  struct ref ref_list[MAX_REFS];
-};
-
 struct ref {
   int x, y, z, objref;
 };
 
+struct ele {
+  int odat_id;
+  int parent_id;//offset into class set_stack
+};
+
+//TODO: Add jump table
 struct set {
   int odat_id;
   int parent_id;//offset into CB
@@ -51,9 +32,12 @@ struct set {
   struct ele ele_list[MAX_ELES];
 };
 
-struct ele {
-  int odat_id;
-  int parent_id;//offset into class set_stack
+
+//8 ids for each direction
+//fdat_id ordered by alphabetical direction
+struct model {
+  char label[32];
+  int fdat_id[8];
 };
 
 //TODO: Do vdats need labels?
@@ -61,12 +45,43 @@ struct vdat {
   int num_models;
   int msi; //model_stack_index
   struct model model_list[MAX_MODELS];
-};
+} vdat_buf[BUF_SIZE];
 
-//8 ids for each direction
-//fdat_id ordered by alphabetical direction
-struct model {
+struct cdat {
   char label[32];
-  int fdat_id[8];
-};
+  int num_subclasses;
+  int num_sets;
+  int subclass_index;
+  int set_index;
+  struct cdat* subclass_list[MAX_SUBCLASSES];
+  struct set set_list[MAX_SETS];
+} cdat_buf[BUF_SIZE];
+
+//Element or a set
+struct odat {
+  char label[32];
+  int vdat_id;
+  int class_id;
+  int num_ref;
+  int ref_index;
+  struct ref ref_list[MAX_REFS];
+} odat_buf[BUF_SIZE];
+
+
+void
+inc_cbi(void);
+
+void
+set_class_label(char*);
+
+void
+inc_subclass_index(void);
+
+void
+inc_subclass_index(void);
+
+void
+inc_ref(void);
 
+void
+inc_models(void);
index c16dc18..f42ea7b 100644 (file)
@@ -3,8 +3,6 @@
   #include <stdio.h>
   #include <string.h>
   #include <dirent.h>
-  #include "sprite.h"
-  #include "symbol.h"
   #include <png.h>
   #include "ir.h"
 
 %token         RLE    //#
 %token         RT     //*
 %token         HB
+%token         MOD
 //nonterminal types
 %type <int> element
 %type <int> vdat
 %type <str> elem_label
+%type <str> label
+
 //terminals
 %token <int> NUM
 %token <int> fd
 %token <str> STR
 %token <int> VAR
 %token <int> SS
+%token <str> FNAME
 //precedence
-%right LOW HIGH
+%precedence LOW
+%precedence MED
+%precedence HIGH
 
-/* Syntax Directed Translation Scheme of the APC grammar */
+ /* Syntax Directed Translation Scheme of the APC grammar */
 
 
 /* Rules */
@@ -49,16 +53,12 @@ class_list                   {condense();} //Seperate file?
 ;
 
 class_list:
-class_list class             {cbi++;};
+class_list class             {inc_cbi()};
 | class
 ;
 
-class_label:
-STR
-;
-
 class:
-class_label CLOPEN class_closure CLCLOSE {CB[cbi].label = $1;};
+label CLOPEN class_closure CLCLOSE {set_class_label($1);};
 ;
 
 class_closure:
@@ -68,24 +68,24 @@ subclass_list
 ;
 
 subclass_list:
-subclass_list class           {CB[cbi].subclass_index++;};
+subclass_list class           {inc_subclass_idx();};
 | class
 ;
 
 set_list:
-set_list set                  {CB[cbi].set_index++;};
+set_list set                  {inc_set_index();};
 | set
 ;
 
 
 //set needs a label, vdat_id.
 set:
-set_map_data element_list     {insert_set();};
-| element_list
+set_map_data element_list HIGH     {insert_set();};
+| element_list LOW
 ;
 
 
-//TODO: Figure out what to do with hitbox and root. 
+//TODO: Figure out what to do with hitbox and root.
 set_map_data:
 ref_list                      {};
 | ref_list hitbox
@@ -100,7 +100,7 @@ RLS quads RLE
 ;
 
 quads:
-quads quad                    {OB[obi].ref_index++;OB[obi].num_ref++;};
+quads quad                    {inc_ref();};
 | quad
 ;
 
@@ -118,12 +118,12 @@ RT NUM NUM NUM
 
 //parent_id is the set_index of the subclass_index.
 element_list:
-element_list element          {CB[cbi].set_stack[stack_index].num_ele++;};
-| element
+element_list element HIGH          {inc_ele();};
+| element LOW
 ;
 
 element:
-set_label elem_label vdat     {insert_ele($2,$3); vbi++;};
+set_label elem_label vdat LOW   {insert_ele($2,$3); };
 ;
 
 set_label:
@@ -135,12 +135,13 @@ elem_label:
 ;
 
 vdat:
-vdat model                    {VB[vbi].num_models++;};
+vdat model               {inc_models();};
 | model
+
 ;
 
 model:
-model fdat
+MOD model fdat
 | fdat
 ;
 
@@ -149,16 +150,10 @@ label SS FNAME                {insert_fdat($1, $2, $3);};
 ;
 
 label:
-STR
+STR REF
+| REF
 ;
 
-ref:
-NUM
-;
-
-FNAME:
-STR
-;
 
 %%
 int