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

📄 util.h

📁 一个简单的C语言子集的编译器,一个简单的C语言子集的编译器
💻 H
字号:

#ifndef UTIL_H_
#define UTIL_H_

#include <string>
#include <map>
#include "global.h"
#include "symtable.h"

using namespace std;
int indent=0;
map<TokenType,string> TokenMap;

void init()
{
	TokenMap[IF]="if";
	TokenMap[ELSE]="else";
	TokenMap[WHILE]="while";
	TokenMap[RETURN]="return";
	TokenMap[VOID]="void";
	TokenMap[INT]="int";
	TokenMap[PLUS]="+";
	TokenMap[MINUS]="-";
	TokenMap[MUL]="*";
	TokenMap[DIV]="/";
	TokenMap[LT]="<";
	TokenMap[LTEQ]="<=";
	TokenMap[GT]=">";
	TokenMap[GTEQ]=">=";
	TokenMap[EQ]="=";
	TokenMap[NEQ]="!=";
	TokenMap[ASSIGN]="==";
	TokenMap[SEMI]=";";
	TokenMap[COMMA]=",";
	TokenMap[LPAREN]="(";
	TokenMap[RPAREN]=")";
	TokenMap[LSQUAR]="[";
	TokenMap[RSQUAR]="]";
	TokenMap[LBRACE]="{";
	TokenMap[RBRACE]="}";
	TokenMap[LCOMMENT]="/*";
	TokenMap[RCOMMENT]="*/";
	TokenMap[ID]="identifier";
	TokenMap[NUMBER]="number";
}
TreeNode *NewNode(Kind kind)
{
	TreeNode *p;
	if(peeking==1) p=&VirtualNode;
	else p=new TreeNode;
	p->kind=kind;
	p->pNext=NULL;
	p->arraynum=-1;
	p->lineno=lineno;
	for(int i=0;i<MAXCHILDREN;i++)
		p->pChild[i]=NULL;
	return p;
}
void PrintIndent(ostream &os)
{
	for(int i=0;i<indent;i++)
		os<<" ";
}
/*
void PrintDeclar(TreeNode *p,ostream &os)
{
}
void PrintExp(TreeNode *p,ostream &os)
{
}
void PrintParam(TreeNode *p,ostream &os)
{
}
void PrintArgs(TreeNode *p,ostream &os)
{
}
*/
void PrintSyntaxTree(TreeNode *p,ostream &os)
{
	if(p==NULL) return;
	indent+=2;
	while(p!=NULL)
	{
		PrintIndent(os);
		switch(p->kind)
		{
		case DECLAR:
			switch(p->childkind.declarK)
			{
			case VAR_DECLAR:
				os<<"Variable Declaration: "<<p->name<<endl;
				break;
			case FUNC_DECLAR:
				os<<"Function Declaration: "<<p->name
					<<", Parameters: "<<endl;
				break;
			}
			break;
		case OP:
		case RELOP:
			os<<p->name<<endl;
			break;
		case STMT:
			switch(p->childkind.stmtK)
			{
			case IF_STMT:
				os<<"if_then_else"<<endl;
				break;
			case WHILE_STMT:
				os<<"while_do"<<endl;
				break;
			case RETURN_STMT:
				os<<"return"<<endl;
				break;
			}
			break;
		case REFER:
			os<<"ID: "<<p->name<<endl;
			break;
		case CALL:
			os<<"CALL: "<<p->name<<", Arguments: "<<endl;
			break;
		case PARAM:
			os<<p->name<<endl;
			break;
		case CSTMT:
			os<<"Compound Statement: "<<endl;
			break;
		case EXP:
			switch(p->childkind.expK)
			{
			case ASSIGN_EXP:
				os<<"Assignment: "<<p->name<<endl;
				break;
			case SIMPLE_EXP:
				os<<"Simple Expression"<<endl;
				break;
			}
			break;
		case NUM:
			os<<"Literal: "<<p->name<<endl;
			break;
		}
		for(int i=0;i<MAXCHILDREN;i++)
			PrintSyntaxTree(p->pChild[i],os);
		p=p->pNext;
	}
	indent-=2;
}
void PrintOneTable(BucketList *p,ostream &os)
{
	BucketList *t=p;
	for(int i=0;i<BUCKET_SIZE;i++)
	{
		if(t->pRecord[i]==NULL) continue;
		else{
			SymbolRecord * p=t->pRecord[i];
			do{
				os<<p->name<<"\t\t"<<p->location
					<<"\t\t"<<p->lineno<<"\t\t"<<
					p->nestlevel<<endl;
				if(p->symboltype==FUNC_SYMBOL){
					SymbolRecord *r=p->pParam;
					while(r!=NULL)
					{
						os<<r->name<<"\t\t"<<r->location
							<<"\t\t"<<r->lineno<<"\t\t"<<
							p->nestlevel<<endl;
						r=r->pNext;
					}
				}
				p=p->pNext;
			}while(p!=NULL);
		}
	}
}
void PrintSymbolTable(TreeNode *p,ostream &os)
{
	if(p==NULL) return;
	while(p!=NULL)
	{
		if(p->kind==CSTMT){
			PrintOneTable(p->pBucketList,os);
		}
		for(int i=0;i<MAXCHILDREN;i++)
			PrintSymbolTable(p->pChild[i],os);
		p=p->pNext;
	}
}
Type GetType(TreeNode *t)
{
	Type type=ERROR_TYPE;
	if(t->kind==PARAM){
		if(t->tokenT==INT) type=INTEGER_TYPE;
	}
	else if(t->kind==DECLAR){
		type=t->tokenT==INT?INTEGER_TYPE:VOID_TYPE;
	}
	return type;
}
SymbolType GetSymbolType(TreeNode *t)
{
	SymbolType symboltype=ERROR_SYMBOL;
	if(t->childkind.declarK==FUNC_DECLAR)
		symboltype=FUNC_SYMBOL;
	else if(t->childkind.declarK==VAR_DECLAR)
		symboltype=VAR_SYMBOL;
	else symboltype=ARRAY_SYMBOL;
	return symboltype;
}
void SyntaxError(string errinfo,int lineno, ostream &os=cout)
{
	os<<"Syntax error at line "<<lineno<<": "<<errinfo<<endl;
	Error=1;
}
void ParseError(string errinfo,int lineno, ostream &os=cout)
{
	os<<"Syntax error at line "<<lineno<<": "<<errinfo<<endl;
	os<<"Compiling interrupped"<<endl;
	exit(lineno);
}
void GenError(string errinfo, ostream &os=cout)
{
	os<<"Cann't generate code: "<<errinfo<<endl;
	os<<"Compiling interrupped"<<endl;
	exit(-1);
}

string GetTokenString(TokenType token)
{
	return TokenMap[token];
}
#endif

⌨️ 快捷键说明

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