?? util.cpp
字號:
#include "globals.h"
#include "util.h"
#include "parse.h"
void printToken(TokenType token,const char* tokenString)
{
switch(token)
{
case IF:
case ELSE:
case WHILE:
case INT:
case FLOAT:
case CHAR:
case BREAK:
case RETURN:
fprintf(listing,"resverved word:%s\n",tokenString);
break;
case ASSIGN: fprintf(listing,"=\n"); break;
case LT: fprintf(listing,"<\n"); break;
case EQ: fprintf(listing,"==\n"); break;
case GT: fprintf(listing,">\n"); break;
case LE: fprintf(listing,"<=\n"); break;
case GE: fprintf(listing,">=\n"); break;
case NE: fprintf(listing,"!=\n"); break;
case LPAREN: fprintf(listing,"(\n"); break;
case RPAREN: fprintf(listing,")\n"); break;
case LBRACKET:fprintf(listing,"[\n"); break;
case RBRACKET:fprintf(listing,"]\n"); break;
case LBC: fprintf(listing,"{\n"); break;
case RBC: fprintf(listing,"}\n"); break;
case SEMI: fprintf(listing,";\n"); break;
case COMMA: fprintf(listing,",\n"); break;
case PLUS: fprintf(listing,"+\n"); break;
case MINUS: fprintf(listing,"-\n"); break;
case TIMES: fprintf(listing,"*\n"); break;
case OVER: fprintf(listing,"/\n"); break;
case AND: fprintf(listing,"&&\n"); break;
case OR: fprintf(listing,"||\n"); break;
case NOT: fprintf(listing,"!\n"); break;
case ENDFILE:fprintf(listing,"EOF\n"); break;
case CONSTCHAR:
fprintf(listing,"constchar,val=%s\n",tokenString);
break;
case NUM:
fprintf(listing,"NUM, val= %s\n",tokenString);
break;
case FLOATNUM:
fprintf(listing,"FLOATNUM,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: %d\n",token);
}
}
TreeNode * newStmtNode(StmtKind kind)
{
TreeNode * t=new 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;
t->tablep=NULL;
}
return t;
}
TreeNode * newExpNode(ExpKind kind)
{
TreeNode * t=new 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;
t->tablep=NULL;
t->type=Void;
}
return t;
}
TreeNode * newDeclNode(DeclKind kind)
{
TreeNode * t=new 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=DeclK;
t->lineno=lineno;
t->tablep=NULL;
t->kind.decl=kind;
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," ");
}
void printTree(TreeNode * tree)
{
int i;
INDENT;
while(tree!=NULL)
{
printSpaces();
if(tree->nodekind==StmtK)
{
switch(tree->kind.stmt)
{
case IfK:
fprintf(listing,"If \n");
break;
case WhileK:
fprintf(listing,"While\n");
break;
case ReturnK:
fprintf(listing,"Return\n");
break;
case CompoundK:
fprintf(listing,"Compound \n");
break;
case BreakK:
fprintf(listing,"Break \n");
break;
case ExpStmtK:
fprintf(listing,"ExpStmt \n");
break;
case AssignK:
fprintf(listing,"AssignStmt \n");
break;
}
}
else if(tree->nodekind==ExpK)
{
switch(tree->kind.exp)
{
case OpK:
fprintf(listing,"Op: ");
printToken(tree->attr.op,"\0");
break;
case ConstK:
switch(tree->type)
{
case Integer:
fprintf(listing,"const: %d \n",tree->attr.vali);
break;
case Float:
fprintf(listing,"const: %f \n",tree->attr.valf);
break;
case Char:
fprintf(listing,"const: %c \n",tree->attr.valc);
break;
}
break;
case IdK:
fprintf(listing,"Id: %s \n",tree->attr.name);
break;
case CallK:
fprintf(listing,"Call:%s \n",tree->attr.name);
break;
case ArrayK:
fprintf(listing,"Array:%s \n ",tree->attr.name);
break;
default:
fprintf(listing,"Unknown ExpNode Kind \n");
break;
}
}
else if(tree->nodekind==DeclK)
{
switch(tree->kind.decl)
{
case SingleVarK:
fprintf(listing,"Declaration SingleVar:%s \n",tree->attr.name);
break;
case ArrayVarK:
fprintf(listing,"Declaration ArrayVar:%s[%d] \n",tree->attr.name,tree->array_size);
break;
case FuncVarK:
fprintf(listing," ReturnType %d Declaration FuncVar: %s \n",tree->type,tree->attr.name);
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 + -