shithub: scc

ref: a100cd930fb84e4e0e1d3dc3c24d3bddd28eb4f0
dir: /cc2/cc2.h/

View raw version

typedef struct {
	short size;
	uint8_t align;
	bool sign : 1;
	bool c_int : 1;
} Type;

typedef struct symbol {
	char public;
	char type;
	struct symbol *next;
	union {
		struct {
			Type *type;
			char sclass;
			short off;
		} v;
		struct {
			short addr;
		} l;
		struct {
			char *name;
			short stack;
			struct symbol *pars;
			struct symbol *vars;
		} f;
	} u;
} Symbol;

typedef struct node {
	char op;
	char subop;
	Type *type;
	uint8_t complex;
	uint8_t addable;
	union {
		Symbol *sym;
		int imm;
	} u;
	struct node *left, *right;
} Node;

enum nerrors {
	EINTNUM,       /* too much internal identifiers */
	EEXTNUM,       /* too much external identifiers */
	ENODEOV,       /* node overflow */
	ESTACKO,       /* stack overflow */
	ESTACKU,       /* stack underflow */
	EEXPROV,       /* expression overflow */
	ETYPERR,       /* incorrect type in expression */
	EEXPBAL,       /* expression not balanced */
	ESYNTAX,       /* syntax error */
	ELNLINE,       /* line too long */
	EFERROR,       /* error reading from file:%s*/
	ENUMERR
};

#define FUN        0
#define VAR        1
#define EFUN       2
#define AUTO      'A'
#define REG       'R'
#define MEM       'T'
#define PAR       'P'
#define CONST     '#'
#define LABEL     'L'
#define OADD      '+'
#define OSUB      '-'
#define OASSIG    ':'
#define OINC      ';'
#define OMOD      '%'
#define ODIV      '/'
#define OSHL      'l'
#define OSHR      'r'
#define OBAND     '&'
#define OBOR      '|'
#define OBXOR     '^'
#define OPTR      '@'
#define OADDR     'a'
#define OLT       '<'
#define OGT       '>'
#define OGE       ']'
#define OLE       '['
#define OEQ       '='
#define ONE       '!'
#define OOR       'o'
#define OAND      'y'

extern void error(unsigned nerror, ...);
extern void genaddable(Node *list[]);
extern void cgen(Symbol *sym, Node *list[]);
extern void genstack(Symbol *fun);