?? util.cpp
字號:
/****************************************************/
/* File: util.c */
/* Main program for c- compiler */
/* Compiler Construction: Principles and Practice */
/* Maker:Liukai */
/****************************************************/
#include "globals.h"
#include "util.h"
/* Procedure printToken prints a token
* and its lexeme to the listing file
*/
void printToken( TokenType token, const char* tokenString )
{ switch (token)
{ case IF:
case ELSE:
case WHILE:
case INT:
case RETURN:
case VOID:
fprintf(listing,
"reserved word: %s\n",tokenString);
break;
case ASSIGN: fprintf(listing,"=\n"); break;
case EQ: fprintf(listing,"==\n"); break;
case NEQ: fprintf(listing,"!=\n"); break;
case LT: 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 LPAREN: fprintf(listing,"(\n"); break;
case RPAREN: fprintf(listing,")\n"); break;
case SEMI: fprintf(listing,";\n"); break;
case DOUHAO: fprintf(listing,",\n"); break;
case ZLPAREN: fprintf(listing,"[\n"); break;
case ZRPAREN: fprintf(listing,"]\n"); break;
case DLPAREN: fprintf(listing,"{\n"); break;
case DRPAREN: fprintf(listing,"}\n"); break;
case MT: fprintf(listing,">\n"); break;
case LET: fprintf(listing,"<=\n"); break;
case MET: fprintf(listing,">=\n"); break;
case ENDFILE: fprintf(listing,"EOF\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: /* should never happen */
fprintf(listing,"Unknown token: %d\n",token);
}
}
/* Function newStmtNode creates a new statement
* node for syntax tree construction
*/
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<3 ;i++ )
{
t->child[i]=NULL;
}
t->sibling=NULL;
t->nodeKind=StmtK;
t->Kind.stmt=Kind;
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;
}*/
/* Function newExpNode creates a new expression
* node for syntax tree construction
*/
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<3 ;i++ )
{
t->child[i]=NULL;
}
t->sibling=NULL;
t->nodeKind=ExpK;
t->Kind.exp=Kind;
t->lineno=lineno;
t->type=Void;
t->idtype1=VarK;
t->is=no;
}
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;
t->type = Void;
}
return t;
}*/
/* Function copyString allocates and makes a new
* copy of an existing string
*/
char * copyString(char *s)
{
int n;
char *t;
if (s==NULL)
{
return NULL;
}
n=strlen(s)+1;
t=new char(n);
if (t==NULL)
{
fprintf(listing,"out of memory error at line %d\n",lineno);
}
else strcpy(t,s);
return t;
}
/*
char * copyString(char * s)
{ int n;
char * t;
if (s==NULL) return NULL;
n = strlen(s)+1;
t = new char(n);
if (t==NULL)
fprintf(listing,"Out of memory error at line %d\n",lineno);
else strcpy(t,s);
return t;
}*/
/* Variable indentno is used by printTree to
* store current number of spaces to indent
*/
static indentno = 0;
/* macros to increase/decrease indentation */
#define INDENT indentno+=2
#define UNINDENT indentno-=2
/* printSpaces indents by printing spaces */
static void printSpaces(void)
{ int i;
for (i=0;i<indentno;i++)
fprintf(listing," ");
}
/* procedure printTree prints a syntax tree to the
* listing file using indentation to indicate subtrees
*/
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 AssignK:
fprintf(listing,"Assign\n");
break;
case ReturnK:
fprintf(listing,"Return\n");
break;
case CompoundK:
fprintf(listing,"Compound\n");
break;
/*case VoidK:
fprintf(listing,"Void\n");
break;
case IntK:
fprintf(listing,"Int\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,"Constno: %d\n",tree->attr.val);
break;
case IdK:
fprintf(listing,"Id: %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<3;i++)
printTree(tree->child[i]);
tree = tree->sibling;
}
UNINDENT;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -