📄 util.h
字号:
#ifndef UTIL_H_
#define UTIL_H_
#include <string>
#include <map>
#include "global.h"
#include "symtable.h"
using namespace std;
int indent=0;
map<TokenType,string> TokenMap;
void init()
{
TokenMap[IF]="if";
TokenMap[ELSE]="else";
TokenMap[WHILE]="while";
TokenMap[RETURN]="return";
TokenMap[VOID]="void";
TokenMap[INT]="int";
TokenMap[PLUS]="+";
TokenMap[MINUS]="-";
TokenMap[MUL]="*";
TokenMap[DIV]="/";
TokenMap[LT]="<";
TokenMap[LTEQ]="<=";
TokenMap[GT]=">";
TokenMap[GTEQ]=">=";
TokenMap[EQ]="=";
TokenMap[NEQ]="!=";
TokenMap[ASSIGN]="==";
TokenMap[SEMI]=";";
TokenMap[COMMA]=",";
TokenMap[LPAREN]="(";
TokenMap[RPAREN]=")";
TokenMap[LSQUAR]="[";
TokenMap[RSQUAR]="]";
TokenMap[LBRACE]="{";
TokenMap[RBRACE]="}";
TokenMap[LCOMMENT]="/*";
TokenMap[RCOMMENT]="*/";
TokenMap[ID]="identifier";
TokenMap[NUMBER]="number";
}
TreeNode *NewNode(Kind kind)
{
TreeNode *p;
if(peeking==1) p=&VirtualNode;
else p=new TreeNode;
p->kind=kind;
p->pNext=NULL;
p->arraynum=-1;
p->lineno=lineno;
for(int i=0;i<MAXCHILDREN;i++)
p->pChild[i]=NULL;
return p;
}
void PrintIndent(ostream &os)
{
for(int i=0;i<indent;i++)
os<<" ";
}
/*
void PrintDeclar(TreeNode *p,ostream &os)
{
}
void PrintExp(TreeNode *p,ostream &os)
{
}
void PrintParam(TreeNode *p,ostream &os)
{
}
void PrintArgs(TreeNode *p,ostream &os)
{
}
*/
void PrintSyntaxTree(TreeNode *p,ostream &os)
{
if(p==NULL) return;
indent+=2;
while(p!=NULL)
{
PrintIndent(os);
switch(p->kind)
{
case DECLAR:
switch(p->childkind.declarK)
{
case VAR_DECLAR:
os<<"Variable Declaration: "<<p->name<<endl;
break;
case FUNC_DECLAR:
os<<"Function Declaration: "<<p->name
<<", Parameters: "<<endl;
break;
}
break;
case OP:
case RELOP:
os<<p->name<<endl;
break;
case STMT:
switch(p->childkind.stmtK)
{
case IF_STMT:
os<<"if_then_else"<<endl;
break;
case WHILE_STMT:
os<<"while_do"<<endl;
break;
case RETURN_STMT:
os<<"return"<<endl;
break;
}
break;
case REFER:
os<<"ID: "<<p->name<<endl;
break;
case CALL:
os<<"CALL: "<<p->name<<", Arguments: "<<endl;
break;
case PARAM:
os<<p->name<<endl;
break;
case CSTMT:
os<<"Compound Statement: "<<endl;
break;
case EXP:
switch(p->childkind.expK)
{
case ASSIGN_EXP:
os<<"Assignment: "<<p->name<<endl;
break;
case SIMPLE_EXP:
os<<"Simple Expression"<<endl;
break;
}
break;
case NUM:
os<<"Literal: "<<p->name<<endl;
break;
}
for(int i=0;i<MAXCHILDREN;i++)
PrintSyntaxTree(p->pChild[i],os);
p=p->pNext;
}
indent-=2;
}
void PrintOneTable(BucketList *p,ostream &os)
{
BucketList *t=p;
for(int i=0;i<BUCKET_SIZE;i++)
{
if(t->pRecord[i]==NULL) continue;
else{
SymbolRecord * p=t->pRecord[i];
do{
os<<p->name<<"\t\t"<<p->location
<<"\t\t"<<p->lineno<<"\t\t"<<
p->nestlevel<<endl;
if(p->symboltype==FUNC_SYMBOL){
SymbolRecord *r=p->pParam;
while(r!=NULL)
{
os<<r->name<<"\t\t"<<r->location
<<"\t\t"<<r->lineno<<"\t\t"<<
p->nestlevel<<endl;
r=r->pNext;
}
}
p=p->pNext;
}while(p!=NULL);
}
}
}
void PrintSymbolTable(TreeNode *p,ostream &os)
{
if(p==NULL) return;
while(p!=NULL)
{
if(p->kind==CSTMT){
PrintOneTable(p->pBucketList,os);
}
for(int i=0;i<MAXCHILDREN;i++)
PrintSymbolTable(p->pChild[i],os);
p=p->pNext;
}
}
Type GetType(TreeNode *t)
{
Type type=ERROR_TYPE;
if(t->kind==PARAM){
if(t->tokenT==INT) type=INTEGER_TYPE;
}
else if(t->kind==DECLAR){
type=t->tokenT==INT?INTEGER_TYPE:VOID_TYPE;
}
return type;
}
SymbolType GetSymbolType(TreeNode *t)
{
SymbolType symboltype=ERROR_SYMBOL;
if(t->childkind.declarK==FUNC_DECLAR)
symboltype=FUNC_SYMBOL;
else if(t->childkind.declarK==VAR_DECLAR)
symboltype=VAR_SYMBOL;
else symboltype=ARRAY_SYMBOL;
return symboltype;
}
void SyntaxError(string errinfo,int lineno, ostream &os=cout)
{
os<<"Syntax error at line "<<lineno<<": "<<errinfo<<endl;
Error=1;
}
void ParseError(string errinfo,int lineno, ostream &os=cout)
{
os<<"Syntax error at line "<<lineno<<": "<<errinfo<<endl;
os<<"Compiling interrupped"<<endl;
exit(lineno);
}
void GenError(string errinfo, ostream &os=cout)
{
os<<"Cann't generate code: "<<errinfo<<endl;
os<<"Compiling interrupped"<<endl;
exit(-1);
}
string GetTokenString(TokenType token)
{
return TokenMap[token];
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -