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

📄 util.cpp

📁 编译原理课程设计 词,语法分析器 用C++手工编写
💻 CPP
字号:
#include "globals.h"
#include "util.h"

void printToken( TokenType token, const char* tokenString )
{
	switch(token)
	{
	case ELSE:
	case IF:
	case INT:
	case RETURN:
	case VOID:
	case WHILE:
		fprintf(listing, "reserved word: %s\n", tokenString);	break;
	case PLUS:
		fprintf(listing, "+\n");	break;
	case MINUS:
		fprintf(listing, "-\n");	break;
	case TIMES:
		fprintf(listing, "*\n");	break;
	case DIV:
		fprintf(listing, "/\n");	break;
	case LT:
		fprintf(listing, "<\n");	break;
	case LEQ:
		fprintf(listing, "<=\n");	break;
	case GT:
		fprintf(listing, ">\n");	break;
	case GEQ:
		fprintf(listing, ">=\n");	break;
	case EQ:
		fprintf(listing, "==\n");	break;
	case NEQ:
		fprintf(listing, "!=\n");	break;
	case ASSIGN:
		fprintf(listing, "=\n");	break;
	case SEMI:
		fprintf(listing, ";\n");	break;
	case COMMA:
		fprintf(listing, ",\n");	break;
	case LPAREN:
		fprintf(listing, "(\n");	break;
	case RPAREN:
		fprintf(listing, ")\n");	break;
	case LSPAREN:
		fprintf(listing, "[\n");	break;
	case RSPAREN:
		fprintf(listing, "]\n");	break;
	case LBPAREN:
		fprintf(listing, "{\n");	break;
	case RBPAREN:
		fprintf(listing, "}\n");	break;
	case ENDFILE:
		fprintf(listing, "EOF");	break;
	case LNOTE:
		fprintf(listing, "/*\n");	break;
	case RNOTE:
		fprintf(listing, "*/\n");	break;

	case NUM:
		fprintf(listing, "NUM,val=%s\n", tokenString);	break;
	case ID:
		fprintf(listing, "ID,name=%s\n", tokenString);	break;
	
	case ERROR:
		fprintf(listing, "ERROR: %s\n", tokenString);	break;
	default:
		fprintf(listing, "Unknown token: %s\n", token);
	}
}


	 TreeNode * newDeclarNode()
{ 
	TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
	int i;
	if (t==NULL)
		fprintf(listing, "Out of memory error at line %d\n",lineno);
	else 
	{
		for (i=0;i<MAXCHILDREN;i++) 
			t->child[i] = NULL;
		t->sibling = NULL;
		t->nodekind = DeclarK;

		t->lineno = lineno;
	}
	return t;
}


TreeNode * newParamNode()
{ 
	TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
	int i;
	if (t == NULL)
		fprintf(listing, "Out of memory error at line %d\n",lineno);
	else 
	{
		for (i=0;i<MAXCHILDREN;i++) 
			t->child[i] = NULL;
		t->sibling = NULL;
		t->nodekind = ParamK;
		t->lineno = lineno;
	}
	return t;
}


TreeNode * newStmtNode ( StmtKind kind )
{
	TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
	int i;
	if (t == NULL)
		fprintf(listing, "Out of memory error at line %d\n", lineno);
	else
	{
		for (i=0; i<MAXCHILDREN; i++)
		{
			t->child[i] = NULL;
		}
		t->sibling = NULL;
		t->nodekind = StmtK;
		t->kind.stmt = kind;
		t->lineno = lineno;
	}
	return t;
}


TreeNode * newExpNode( ExpKind kind )
{
	TreeNode * t = (TreeNode * ) malloc(sizeof(TreeNode));
	int i;
	if (t == NULL)
		fprintf(listing, "Out of memory error at line %d\n", lineno);
	else
	{
		for (i=0; i<MAXCHILDREN; i++)
		{
			t->child[i] = NULL;
		}
		t->sibling = NULL;
		t->nodekind = ExpK;
		t->kind.exp = kind;
		t->lineno = lineno;
		strcpy(t->type, "void");
	}
	return t;
}



char * copyString(char* s)
{
	int n;
	char * t;
	if (s == NULL) 
		return NULL;
	n = strlen(s) + 1;
	t = (char*)(malloc(n));
	if (t == NULL)
		fprintf(listing, "Out of memory error at line %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, " ");
	}
}


//parser
void printTree( TreeNode * tree )
{ 
	int i;
	INDENT;
	while (tree != NULL) 
	{
		printSpaces();
		if (tree->nodekind==DeclarK)
		{ 
			switch (tree->kind.declar) 
			{
			case VarK:
				fprintf(listing,"VAR declaration: %s %s\n",tree->type,tree->attr.name);
				break;
			case ArrayK:
				fprintf(listing,"ARRAY declaration: %s %s[]\n",tree->type,tree->attr.name);
				break;
			case FuncK:
				fprintf(listing,"FUNCTION declarations: %s %s\n",tree->type,tree->attr.name);
				break;
			default:
				fprintf(listing,"Unknown DeclarNode Kind\n");
				break;
			}
		}
		else if (tree->nodekind == ParamK)
		{ 
			switch (tree->kind.param) 
			{
			case Var:
				fprintf(listing,"VAR paramr:  %s %s\n",tree->type,tree->attr.name);
				break;
			case Array:
				fprintf(listing,"ARRAY param: %s %s[]\n",tree->type,tree->attr.name);
				break;
			case Null:
				fprintf(listing,"VOID param\n");
				break;
			default:
				fprintf(listing,"Unknown ParamNode kind\n");
				break;
			}
		}
		else if (tree->nodekind==StmtK)
		{ 
			switch (tree->kind.stmt)
			{
			case IfK:
				fprintf(listing,"IF-stmt:\n");
				break;
			case CompoundK:
				fprintf(listing,"COMPOUND-stmt:\n");
				break;
			case WhileK:
				fprintf(listing,"WHILE-stmt:\n");
				break;
			case ReturnK:
				fprintf(listing,"RETURN-stmt:\n");
				break;
			case ExpressionK:
				fprintf(listing,"EXPression-stmt:\n");
				break;
			default:
				fprintf(listing,"Unknown ExpNode kind\n");
				break;
			}
		}
		else if (tree->nodekind==ExpK)
		{ 
			switch (tree->kind.exp) 
			{
			case OpK:
				fprintf(listing,"OP: ");
				printToken(tree->attr.op,"\0");
				break;
			case ConstK:
				fprintf(listing,"CONST: %d\n",tree->attr.val);
				break;
			case IdVarK:
				fprintf(listing,"VAR: %s\n",tree->attr.name);
				break;
			case IdArrayK:
				fprintf(listing,"ARRAY: %s[]\n",tree->attr.name);
				break;
			case CallK:
				fprintf(listing,"CALL: %s\n",tree->attr.name);
				break;
			default:
				fprintf(listing,"Unknown ExpNode kind\n");
				break;
			}
		}
		else fprintf(listing,"Unknown node kind\n");
		for (i=0; i<MAXCHILDREN; i++)
			printTree(tree->child[i]);
		tree = tree->sibling;
	}
	UNINDENT;
}

⌨️ 快捷键说明

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