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

📄 util.c

📁 编译原理课设
💻 C
字号:
/* 公用函数的实现		*/
/* 编码:彭立勋&&张皖龙	*/
/* 注释:彭立勋			*/

#include "Globals.h"
#include "Util.h"
#include "Parse.h"

void printType(Type type)
{
	switch(type)
	{
		case Void:		fprintf(listing, "无值型"); 
						break;
		case Integer:	fprintf(listing, "整型"); 
						break;
		case Float:		fprintf(listing, "实型"); 
						break;
		case Char:		fprintf(listing, "字符型"); 
						break;
		case Boolean:	fprintf(listing, "布尔型"); 
						break;
		default:		fprintf(listing, "未知类型"); 
						break;
	}
}

/* 打印一个标记和它的语义 */
void printToken(TokenType token, const char* tokenString )
{ 
	switch (token)
	{ 
		case INT:
		case CHAR:
		case FLOAT:
		case VOID:
		case IF:
	    case ELSE:
	    case WHILE:
	    case RETURN:
			fprintf(listing, "获取单词: %s\n", tokenString);
			break;
		case PLUS:	fprintf(listing, "+\n");	
					break;
		case SUB:	fprintf(listing, "-\n");
					break;
		case MUT:	fprintf(listing, "*\n"); 
					break;
		case DIV:	fprintf(listing, "/\n");
					break;
		case LT:	fprintf(listing, "<\n"); 
					break;
		case LE:	fprintf(listing, "<=\n"); 
					break;
		case GT:	fprintf(listing, ">\n"); 
					break;
		case GE:	fprintf(listing, ">=\n"); 
					break;
		case EQ:	fprintf(listing, "==\n"); 
					break;
		case NEQ:	fprintf(listing, "!=\n"); 
					break;
		case AND:	fprintf(listing, "&&\n"); 
					break;
		case OR:	fprintf(listing, "||\n"); 
					break;
		case NOT:	fprintf(listing, "!\n"); 
					break;
		case ASSIGN:fprintf(listing, "=\n"); 
					break;
		case SEMI:	fprintf(listing, ";\n"); 
					break;
		case COMMA: fprintf(listing, ",\n");
					break;
		case LP:	fprintf(listing, "(\n"); 
					break;
		case RP:	fprintf(listing, ")\n"); 
					break;
		case LSP:	fprintf(listing, "[\n"); 
					break;
		case RSP:	fprintf(listing, "]\n"); 
					break;
		case LFP:	fprintf(listing, "{\n");
					break;
		case RFP:	fprintf(listing, "}\n");
					break;
		case ENDFILE: fprintf(listing, "EOF\n"); 
					break;
		case NUM:	fprintf(listing,"[整数] 内容为 %s\n", tokenString); 
					break;
		case FNUM:	fprintf(listing,"[实数] 内容为 %s\n", tokenString); 
					break;
		case SCHAR: fprintf(listing,"[字串] 内容为 %s\n", tokenString);
					break;
		case ID:	fprintf(listing,"[标识] 内容为 %s\n", tokenString); 
					break;
		case ERROR:	fprintf(listing,"错误: %s\n", tokenString); 
					break;
		default:
			fprintf(listing,"未知标记: %d 个\n", token);
  }
}

/* 为构建语法树创建新结点 */
TreeNode * newDecNode(DecKind kind)
{ 
	TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
	int i;

	if (t==NULL)
		fprintf(listing, "内存溢出错误在第 %d 行\n", lineno);
	else
	{
		for (i=0; i<MAXCHILDREN; ++i)
			t->child[i] = NULL;
		t->sibling	= NULL;
		t->nodekind = Dec;
		t->lineno	= lineno;
		t->call_stmt= 0;
		t->kind.dec	= kind;
	}
	return t;
}

TreeNode * newStmtNode(StmtKind kind)
{
	TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
	int i;

	if (t==NULL)
		fprintf(listing, "内存溢出错误在第 %d 行\n", lineno);
	else
	{
		for (i=0; i<MAXCHILDREN; ++i)
			t->child[i] = NULL;
		t->sibling	= NULL;
		t->nodekind	= Stmt;
		t->lineno	= lineno;
		t->call_stmt= 0;
		t->kind.stmt= kind;
	}
	return t;
}

TreeNode * newExpNode(ExpKind kind)
{ 
	TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
	int i;

	if (t==NULL)
		fprintf(listing, "内存溢出错误在第 %d 行\n", lineno);
	else
	{
		for (i=0; i<MAXCHILDREN; ++i)
			t->child[i] = NULL;
		t->sibling	= NULL;
		t->nodekind	= Exp;
		t->lineno	= lineno;
		t->call_stmt= 0;
		t->kind.exp	= kind;
	}
	return t;
}


/* 分配空间,拷贝字串 */
char * copyString(char * s)
{
	int n;
	char * t;

	if (s==NULL) 
		return NULL;
	n = strlen(s)+1;
	t = malloc(n);
	if (t==NULL)
		fprintf(listing, "内存溢出错误在第 %d 行\n", lineno);
	else
		strcpy(t,s);
	return t;
}

/* 为打印树记录缩进 */
static indentno = 0;

/* 增加减小缩进的宏 */
#define INDENT		indentno += 2
#define UNINDENT	indentno -= 2

static void printSpaces(void)
{
	int i;

	for (i=0; i<indentno; ++i)
	fprintf(listing, " ");
}

/* 打印语法树到列表文件 */
void printTree(TreeNode * tree)
{
	int i;

	INDENT;
	while (tree != NULL) 
	{
		printSpaces();
		switch (tree->nodekind)
		{
			case Dec:
				switch(tree->kind.dec)
				{
					case VarK:
						fprintf(listing, "标识声明 变量类型: ");
						printType(tree->type);
						fprintf(listing, "\n");
						break;
					case FunDecK:
						fprintf(listing, "函数声明 名称: %s	(返回类型: ", tree->attr.name);
						printType(tree->type);
						fprintf(listing, ")\n");
						break;
					case FunDefK:
						fprintf(listing, "函数定义 名称: %s	(返回类型: ", tree->attr.name);
						printType(tree->type);
						fprintf(listing,")\n");
						break;
					case ParamK:
						fprintf(listing, "参数声明 参数类型: ");
						printType(tree->type);
						fprintf(listing, "\n");
						break;
					case CompK:
						fprintf(listing, "复合声明 \n");
						break;
				}
				break;
			case Stmt:
				switch(tree->kind.stmt)
				{
					case IfK:
						fprintf(listing, "IF\n");
						break;
					case WhileK:
						fprintf(listing, "WHILE\n");
						break;
					case AssignK:
						fprintf(listing, "分配空间\n");
						break;
					case ReturnK:
						fprintf(listing, "RETURN\n");
						break;
					case CallK:
						fprintf(listing, "CALL: %s\n", tree->attr.name);
						break;
					case ContinueK:
						fprintf(listing, "CONTINUE\n");
						break;
					case BreakK:
						fprintf(listing, "BREAK\n");
						break;
				}
				break;
			case Exp:
				switch(tree->kind.exp)
				{
					case NumK:
						fprintf(listing, "整型常数: %d\n", tree->attr.val.i);
						break;
					case FnumK:
						fprintf(listing, "实型常数: %f\n", tree->attr.val.f);
						break;
					case CharK:
						fprintf(listing, "字符常数: %c\n", tree->attr.val.i);
						break;
					case IdK:
						fprintf(listing, "变量: %s\n", tree->attr.name);
						break;
					case NotK:
						fprintf(listing, "非: \n");
						break;
					default:
						fprintf(listing, "操作符: ");
						printToken(tree->attr.op, "\0");
						break;
				}
				break;
			default:
				fprintf(listing, "未知树节点种类\n");
				break;
		}
    
		for (i=0; i<MAXCHILDREN; ++i)
			printTree(tree->child[i]);
		tree = tree->sibling;
	}
	UNINDENT;
}
       

⌨️ 快捷键说明

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