97 lines
2.5 KiB
C
97 lines
2.5 KiB
C
/* $Header$ */
|
|
#include <stdio.h>
|
|
#include <system.h>
|
|
|
|
/* type of arguments expected by each instruction */
|
|
#define NOARG 1
|
|
#define CST 2
|
|
#define CSTOPT 3
|
|
#define LAB 4
|
|
#define DEFILB 5
|
|
#define PNAM 6
|
|
#define EXT 7
|
|
|
|
#define IDF_TYPE struct id_info
|
|
struct id_info {
|
|
struct idf *nextidf; /* chain all opcodes together */
|
|
int used; /* is this op used? */
|
|
int startpatt; /* does it start a pattern? */
|
|
int opcode; /* opcode of operator */
|
|
int argfmt; /* how to access pattern argument */
|
|
#define id_nextidf id_user.nextidf
|
|
#define id_used id_user.used
|
|
#define id_startpatt id_user.startpatt
|
|
#define id_opcode id_user.opcode
|
|
#define id_argfmt id_user.argfmt
|
|
};
|
|
#include <idf_pkg.spec>
|
|
|
|
struct exp_node {
|
|
int node_type;
|
|
union {
|
|
struct {
|
|
struct exp_node *left;
|
|
struct exp_node *right;
|
|
} interior;
|
|
int val;
|
|
} node_args;
|
|
#define exp_left node_args.interior.left
|
|
#define exp_right node_args.interior.right
|
|
#define leaf_val node_args.val
|
|
};
|
|
|
|
struct mnem_elem {
|
|
struct idf *op_code;
|
|
struct exp_node *arg; /* optional arg expression if replacement */
|
|
};
|
|
|
|
struct mnem_list {
|
|
struct mnem_list *next; /* cdr of list */
|
|
struct mnem_elem *elem; /* car of list */
|
|
};
|
|
|
|
struct mnems {
|
|
int m_len; /* number of mnem's in pattern */
|
|
struct mnem_elem **m_elems; /* array of mnem's */
|
|
};
|
|
|
|
struct action {
|
|
struct action *next; /* chain all actions for same state together */
|
|
int linenum; /* line number in patterns */
|
|
struct exp_node *test; /* test expression (if any) */
|
|
struct mnems replacement; /* replacement pattern */
|
|
};
|
|
|
|
struct state {
|
|
struct state *next; /* chain to next entry for this state */
|
|
struct idf *op; /* transition on op to.. */
|
|
int goto_state; /* state 'goto_state' */
|
|
};
|
|
|
|
#define MAXSTATES 2000
|
|
#define MAXPATTERN 20
|
|
|
|
/* Parser globals */
|
|
extern struct state *states[MAXSTATES];
|
|
extern struct action *actions[MAXSTATES];
|
|
extern struct mnems patterns[MAXSTATES];
|
|
extern int numpatterns; /* Number of patterns */
|
|
extern int higheststate; /* Highest state yet allocated */
|
|
extern struct idf *ops; /* Chained list of all ops */
|
|
extern int maxpattern;
|
|
extern int maxreplacement;
|
|
extern int nerrors;
|
|
extern FILE *ofile;
|
|
|
|
/* Lexical analyser globals */
|
|
extern struct idf *opval; /* opcode of returned OPCODE*/
|
|
extern int lastintval; /* value of last integer seen */
|
|
extern int linenum; /*line number of input file*/
|
|
|
|
/* Functions not returning int */
|
|
char *Malloc();
|
|
struct exp_node *mknode();
|
|
struct exp_node *mkleaf();
|
|
struct exp_node *combinetests();
|
|
struct mnem_list *addelem();
|
|
struct mnem_elem **constructlist();
|