typedef struct Sym Sym;typedef struct Symlist Symlist;typedef struct Type Type;typedef struct Typelist Typelist;typedef struct Dtype Dtype;typedef struct Btype Btype;typedef struct Names Names; struct Sym { Llrb; int lex; Rune *name; Type *type; Type *newtype; Names *sunames; Symlist *sulist; uchar tycl; uchar block; uchar suetype;}; struct Symlist { Sym **sp, Sym **ep; int cap; Symlist *link;}; struct Btype { Sym *sue; u32int tycl;}; struct Type { Btype; Type *chantype; Dtype *dtype, Dtype **dtail;}; struct Dtype { int t; int alen; Typelist *param; Dtype *link;}; struct Typelist { Type **sp, **ep; int cap; Typelist *link;}; struct Names { Llrbtree *t; int block; Names *parent;}; enum { KVOID, KCHAR, KSHORT, KINT, KLONG, KFLOAT, KDOUBLE, KSIGNED, KUNSIGNED, KCONST, KVOLATILE, KAUTO, KREGISTER, KSTATIC, KEXTERN, KTYPEDEF, KCHAN, KSTRUCT, KUNION, KENUM, NKEYS, TVOID = 0, TSHORT, TLONG, TVLONG, TCHAR, TINT, TDOUBLE, TFLOAT, NTYPE, BTYPE = NTYPE - 1, TSIGNED = NTYPE, TUNSIGNED, NSIGN, BSIGN = NSIGN-1 ^ BTYPE, TCONST = TUNSIGNED + 1, TAUTO, TSTATIC, TEXTERN, TTYPEDEF, NCLASS, BCLASS = NCLASS-1 ^ (BSIGN|BTYPE), TVOLATILE = NCLASS, TREGISTER, TDOTS, TPTR = 0, TARR, TFUNC, TSTRUCT, TUNION, TENUM}; #pragma varargck type "Y" Sym*#pragma varargck type "T" Type*#pragma varargck type "D" Type* void usage(void); int yyparse(void);int yylex(void);void yyerror(char*); Sym *lookup(Names*, Rune*);Sym *sym(Names*, Rune*);void symfree(Sym*);void pushblock(void);void popblock(void);Names *pushnames(Names*);Names *popnames(Names*);Names *addparent(Names*, Names*);void printsyms(void); int typeeq(Type*, Type*); Symlist *symlist(void);void symlistfree(Symlist*);Symlist *addsym(Symlist*, Sym*);Typelist *typelist(void);void typelistfree(Typelist*);Typelist *addtype(Typelist*, Type*);Type *type(void);void typefree(Type*);Dtype *dtype(Type*, int); void error(char*, ...);void warn(char*, ...);void *emalloc(ulong);void *emallocz(ulong);void *ecalloc(ulong, ulong);void *erealloc(void*, ulong);Rune *erunestrdup(Rune*);void efmtprint(Fmt*, char*, ...); void setupout(void);void pushfile(char*);void pushstream(int);Rune getr(void);int ungetr(void);void copyout(void);void nocopyout(void);void printchandecls(Symlist*);int isspacer(Rune);int isalphar(Rune);int isdigitr(Rune); extern int dbg, line, block, suelookup;extern char filename[1024];extern Names *namespace;
typedef struct Sym Sym;
typedef struct Symlist Symlist;
typedef struct Type Type;
typedef struct Typelist Typelist;
typedef struct Dtype Dtype;
typedef struct Btype Btype;
typedef struct Names Names;
struct Sym {
Llrb;
int lex;
Rune *name;
Type *type;
Type *newtype;
Names *sunames;
Symlist *sulist;
uchar tycl;
uchar block;
uchar suetype;
};
struct Symlist {
Sym **sp, Sym **ep;
int cap;
Symlist *link;
};
struct Btype {
Sym *sue;
u32int tycl;
};
struct Type {
Btype;
Type *chantype;
Dtype *dtype, Dtype **dtail;
};
struct Dtype {
int t;
int alen;
Typelist *param;
Dtype *link;
};
struct Typelist {
Type **sp, **ep;
int cap;
Typelist *link;
};
struct Names {
Llrbtree *t;
int block;
Names *parent;
};
enum {
KVOID,
KCHAR,
KSHORT,
KINT,
KLONG,
KFLOAT,
KDOUBLE,
KSIGNED,
KUNSIGNED,
KCONST,
KVOLATILE,
KAUTO,
KREGISTER,
KSTATIC,
KEXTERN,
KTYPEDEF,
KCHAN,
KSTRUCT,
KUNION,
KENUM,
NKEYS,
TVOID = 0,
TSHORT,
TLONG,
TVLONG,
TCHAR,
TINT,
TDOUBLE,
TFLOAT,
NTYPE,
BTYPE = NTYPE - 1,
TSIGNED = NTYPE,
TUNSIGNED,
NSIGN,
BSIGN = NSIGN-1 ^ BTYPE,
TCONST = TUNSIGNED + 1,
TAUTO,
TSTATIC,
TEXTERN,
TTYPEDEF,
NCLASS,
BCLASS = NCLASS-1 ^ (BSIGN|BTYPE),
TVOLATILE = NCLASS,
TREGISTER,
TDOTS,
TPTR = 0,
TARR,
TFUNC,
TSTRUCT,
TUNION,
TENUM
};
#pragma varargck type "Y" Sym*
#pragma varargck type "T" Type*
#pragma varargck type "D" Type*
void usage(void);
int yyparse(void);
int yylex(void);
void yyerror(char*);
Sym *lookup(Names*, Rune*);
Sym *sym(Names*, Rune*);
void symfree(Sym*);
void pushblock(void);
void popblock(void);
Names *pushnames(Names*);
Names *popnames(Names*);
Names *addparent(Names*, Names*);
void printsyms(void);
int typeeq(Type*, Type*);
Symlist *symlist(void);
void symlistfree(Symlist*);
Symlist *addsym(Symlist*, Sym*);
Typelist *typelist(void);
void typelistfree(Typelist*);
Typelist *addtype(Typelist*, Type*);
Type *type(void);
void typefree(Type*);
Dtype *dtype(Type*, int);
void error(char*, ...);
void warn(char*, ...);
void *emalloc(ulong);
void *emallocz(ulong);
void *ecalloc(ulong, ulong);
void *erealloc(void*, ulong);
Rune *erunestrdup(Rune*);
void efmtprint(Fmt*, char*, ...);
void setupout(void);
void pushfile(char*);
void pushstream(int);
Rune getr(void);
int ungetr(void);
void copyout(void);
void nocopyout(void);
void printchandecls(Symlist*);
int isspacer(Rune);
int isalphar(Rune);
int isdigitr(Rune);
extern int dbg, line, block, suelookup;
extern char filename[1024];
extern Names *namespace;