⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmm.h

📁 unix环境下实现的cmm语言编译器
💻 H
字号:
#ifndef CMM_H#define CMM_H#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h>#include "cstring.h"#include "list.h"#include "alloc.h"#ifndef _POSIX_ARG_MAX# define _POSIX_ARG_MAX 4096#endifenum {#define xx(a,b,c,d,e,f,g)	a=b,#define yy(a,b,c,d,e,f,g)#include "token.h"};#define roundup(x,n) (((x)+((n)-1))&(~((n)-1))) #define NELEMS(a) (int)(sizeof(a) / sizeof((a)[0]))#define isfunc(t) ((t)->op == FUNCTION)#define isptr(t) ((t)->op == POINTER)#define ischar(t) ((t)->op == CHAR)#define isint(t) ((t)->op == INT)#define isarray(t) ((t)->op == ARRAY)#define isvoid(t) ((t)->op == VOID)#define isunsigned(t) ((t)->op == UNSIGNED)#define isarith(t) (isint(t)||ischar(t)|| isunsigned(t))#define istypename(op) ((op) == CHAR || (op) == INT || (op) == VOID)#define isvoidptype(t) (isptr(t) && (t)->type == voidtype)#define isscalar(t) ((t)->op <= POINTER)#ifdef NDEBUG#define DEBUG(x) #else#define DEBUG(x) fprint(2,"%s %d:",__FUNCTION__,__LINE__),(x)#endiftypedef struct symbol *Symbol;typedef struct type *Type;typedef struct table *Table;typedef struct code *Code;typedef struct node *Node;typedef struct tree *Tree;typedef union value{		/*保存常量的值*/	char c;	int i;	unsigned u;	void *p;	}Value;typedef struct { 			/*文件位置坐标*/	char *file;	int	x;	int y;}Coordinate;struct type{				/*标示符的类型*/		int op;	Type type;	int align;	int size;	Type *proto; 			/*函数的参数类型列表*/};#include "config.h"enum {AUTO=0,REGISTER=1};	/*标示符的存储类别*/struct symbol {	char *name;				/*标示符的名字*/	int scope;				/*作用域*/	int sclass;				/*存储类型*/	Coordinate src;			/*坐标位置*/	Symbol up;				/*符号表中的上一个元素*/	Type type;				/*标示符的类型*/	List use;	float ref;				/*引用的频率*/	unsigned defined:1;		/*标示符已定义的标志*/	unsigned generated:1;	/*生成标示符的标志*/	unsigned addressed:1;	/*地址变量用于指示后端不能将其做为寄存器变量*/	unsigned temporary:1;	/*临时变量*/	union {		struct {			Value v;		/*常量*/			Symbol loc;			}c;		int seg;			/*数据所在的段*/		struct {			int label;		/*标号的内部值*/		   Symbol equatedto;/*连接等价的标号*/		}l;					/*标号*/		struct {			int label;						Symbol *callee;	/*函数的参数列表*/		}f;					/*函数*/	}u;	Xsymbol x;};struct node {				/*dag的结点*/	int op;					/*操作符*/	int count;				/*引用计数*/	Symbol syms[3];				Node kids[2];			/*子结点*/	Node link;	Xnode x;};struct tree {				/*抽象语法树*/	int op;			Type type;				/*结果类型*/	Tree kids[2];			/*子树*/	Node node;		union {		Value v;			/*常量*/		Symbol sym;			/*标示符的符号表入口*/	}u;	};enum { CODE=1, BSS, DATA};enum {	C=CHAR,	I=INT,	V=VOID,	P=POINTER,	A=ARRAY,	U=UNSIGNED};enum {						/*操作符*/	CNST=1<<3,	CNSTC=CNST+C,	CNSTI=CNST+I,	CNSTP=CNST+P,	ARG=2<<3,	ARGI=ARG+I,	ARGP=ARG+P,	ASGN=3<<3,	ASGNC=ASGN+C,	ASGNI=ASGN+I,	ASGNP=ASGN+P,	ASGNA=ASGN+A,	INDIR=4<<3,	INDIRC=INDIR+C,	INDIRI=INDIR+I,	INDIRP=INDIR+P,	CVC=5<<3,	CVCI=CVC+I,	CVI=6<<3,	CVIC=CVI+C,	CVIU=CVI+U,	CVP=7<<3,	CVPU=CVP+U,	CALL=8<<3,	CALLI=CALL+I,	CALLV=CALL+V,	RET=9<<3,	RETI=RET+I,	ADDRG=10<<3,	ADDRGP=ADDRG+P,	ADDRL=11<<3,	ADDRLP=ADDRL+P,	ADD=12<<3,	ADDI=ADD+I,	ADDP=ADD+P,	SUB=13<<3,	SUBI=SUB+I,	SUBP=SUB+P,	MOD=14<<3,	MODI=MOD+I,	DIV=15<<3,	DIVI=DIV+I,	MUL=16<<3,	MULI=MUL+I,	EQ=17<<3,	EQI=EQ+I,	EQU=EQ+U,	GE=18<<3,	GEI=GE+I,	GEU=GE+U,	GT=19<<3,	GTI=GT+I,	GTU=GT+U,	LE=20<<3,	LEI=LE+I,	LEU=LE+U,	LT=21<<3,	LTI=LT+I,	LTU=LT+U,	NE=22<<3,	NEI=NE+I,	NEU=NE+U,	JUMP=23<<3,	JUMPV=JUMP+V,	LABEL=24<<3,	LABELV=LABEL+V,	NOT=25<<3,	NOTI=NOT+I,	NEG=26<<3,	NEGI=NEG+I,	CVU=27<<3,	CVUI=CVU+I,	CVUP=CVU+P,	LOAD=28<<3,	LOADC=LOAD+C,	LOADI=LOAD+I,	LOADU=LOAD+U,	LOADP=LOAD+P,};struct code {				/*代码表*/	enum { Blockbeg, Blockend, Label,			Start, Gen, Jump}kind;	Code prev, next;	union {		struct {			int level;		/*块的作用域*/			Symbol *locals;	/*保存块开始处声明的局部变量列表*/			Env x;		}block;		Code begin;		Symbol var;		Node forest;	}u;};#define isaddrop(op) (generic(op) == ADDRG || generic(op) == ADDRL)#define generic(op) ((op)&(~0<<3))#define index(op)	((op)>>3)#define optype(op)	((op)&0x7)#include "error.h"#include "output.h"typedef struct interface {	/*后端的接口*/void (*blockbeg)(Env *);void (*blockend)(Env *);void (*defaddress)(Symbol);void (*defconst)(int ty, Value v);void (*defstring)(int n, char *s);void (*defsymbol)(Symbol);void (*export)(Symbol);void (*function)(Symbol, Symbol[], Symbol[]);void (*gen)(Node);void (*global)(Symbol);void (*import)(Symbol);void (*local)(Symbol);void (*progbeg)(void);void (*progend)(void);void (*segment)(int);void (*space)(int);Xinterface	x;} Interface;extern 			Interface *IR;extern 			Interface x86IR;/*input.c*/extern void 	inputInit(void);extern void 	nexline(void);extern unsigned char *cp,*limit;extern char 	*line;extern int 		infd;extern int 		lineno;extern char 	*file;extern int 		t;/*decl.c*/extern Symbol 	cfunc;extern void 	program(void);extern void 	compound(int loop, int lev);extern void 	finalize();extern Type 	type_name(void);/*init.c*/extern Type 	initializer(Type ty, int lev);/*stmt.c*/extern struct 	code codehead;extern Code 	codelist;extern Code 	code(int kind);extern void 	statement(int loop, int lev);extern void 	definelab(int lab);extern void 	equatelab(Symbol old, Symbol new);extern Node 	jump(int lab);extern void 	branch(int lab);/*expr.c*/;extern float 	refinc;extern Tree 	expr(int tok);extern Tree 	idtree(Symbol p);extern Tree 	rvalue(Tree p);extern Tree 	lvalue(Tree p);extern Tree 	retype(Tree p, Type ty);extern Tree 	pointer(Tree p);extern Tree 	cond(Tree p);extern Tree 	cast(Tree p, Type ty);extern char 	*funcname(Tree f);/*enode.c*/extern Tree 	(*optree[])(int op, Tree l, Tree r);extern Tree 	call(Tree f, Type fty, Coordinate *src);extern Tree 	consttree(int n, Type ty);extern Tree 	eqtree(int op, Tree l, Tree r);extern Type 	assign(Type xty, Tree e);extern Tree 	asgntree(int op, Tree l, Tree r);extern Tree 	asgn(Symbol p, Tree e);extern void 	typeerror(int op, Tree l, Tree r);/*simp.c*/extern Tree 	constexpr(int tok);extern int 		intexpr(int tok);extern Tree 	simplify(int op, Type ty, Tree l, Tree r);/*dag.c*/extern int 		reg_var_count;extern Node 	newnode(int op, Node l, Node r, Symbol sym);extern void 	walk(Tree e, int tlab, int flab);extern void 	gencode(Symbol caller[], Symbol callee[]);/*tree.c*/extern Tree 	tree(int op, Type type, Tree left, Tree right);extern void 	printtree(Tree e);extern void 	print_dag(Node p);extern Tree		texpr(Tree (*f)(int tok),int tok, int arena);/*lex.c*/extern char 	*token;extern Symbol 	tsym;extern 			Coordinate src;extern int 		gettoken(void);/*sym.c*/enum{CONSTANT = 1,		/*常量的符号表*/	LABELS,				/*标号的符号表*/	GLOBAL,				/*全局的符号表*/	LOCALS				/*局部及参数的符号表*/	};extern int 		level;extern Table 	constants;extern Table 	identifiers;extern Table 	globals;extern Table 	labels;extern void		init_sym(void);extern Table 	table(Table tp, int level);extern void 	foreach(Table tp, int lev,void (*apply)(Symbol, void*),void*c1);extern void 	enterscope(void);extern void 	exitscope(void);extern Symbol 	install(char *name,Table *tpp,int lev,unsigned arena);extern Symbol 	lookup(char *name, Table tp);extern int 		genlabel(int n);extern Symbol 	findlabel(int lab);extern Symbol 	constant(Type ty,Value v);extern Symbol 	intconst(int n);extern Symbol 	genident(Type ty, int lev);extern Symbol 	temporary(int sclass, Type ty, int lev);extern Symbol	newtemp(int reg,int tc);/*type.c*/extern Type		chartype;extern Type		inttype;extern Type		voidtype;extern Type		unsignedtype;extern Type		voidptype;extern Type		ptr(Type ty);extern Type		deref(Type ty);extern Type		array(Type ty, int n, int aling);extern Type		atop(Type ty);extern Type		func(Type ty, Type *proto);extern Type		freturn(Type ty);extern int		ttob(Type ty);extern int		eqtype(Type ty1, Type ty2);extern Type		promote(Type ty);extern Type		binary(Type xty, Type yty);extern void		outtype(Type ty);extern Type		btot(int op);/*gen.c*/extern Symbol	mkreg(char *fmt, int n);extern int		askregvar(Symbol, Symbol);extern int		mkactual(int, int);extern void		mkauto(Symbol);extern Symbol	mkreg(char *, int);extern Symbol	mkwildcard(Symbol *);extern void		rtarget(Node, int, Symbol);extern void		setreg(Node, Symbol);extern int		getregnum(Node p);#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -