#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)
{
}
-//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++;
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
/* 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++)
{
}
+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++;
+}
/* 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
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?
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);
#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 */
;
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:
;
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
;
quads:
-quads quad {OB[obi].ref_index++;OB[obi].num_ref++;};
+quads quad {inc_ref();};
| quad
;
//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:
;
vdat:
-vdat model {VB[vbi].num_models++;};
+vdat model {inc_models();};
| model
+
;
model:
-model fdat
+MOD model fdat
| fdat
;
;
label:
-STR
+STR REF
+| REF
;
-ref:
-NUM
-;
-
-FNAME:
-STR
-;
%%
int