📄 util.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 + -