📄 util.c
字号:
/* 公用函数的实现 */
/* 编码:彭立勋&&张皖龙 */
/* 注释:彭立勋 */
#include "Globals.h"
#include "Util.h"
#include "Parse.h"
void printType(Type type)
{
switch(type)
{
case Void: fprintf(listing, "无值型");
break;
case Integer: fprintf(listing, "整型");
break;
case Float: fprintf(listing, "实型");
break;
case Char: fprintf(listing, "字符型");
break;
case Boolean: fprintf(listing, "布尔型");
break;
default: fprintf(listing, "未知类型");
break;
}
}
/* 打印一个标记和它的语义 */
void printToken(TokenType token, const char* tokenString )
{
switch (token)
{
case INT:
case CHAR:
case FLOAT:
case VOID:
case IF:
case ELSE:
case WHILE:
case RETURN:
fprintf(listing, "获取单词: %s\n", tokenString);
break;
case PLUS: fprintf(listing, "+\n");
break;
case SUB: fprintf(listing, "-\n");
break;
case MUT: fprintf(listing, "*\n");
break;
case DIV: fprintf(listing, "/\n");
break;
case LT: fprintf(listing, "<\n");
break;
case LE: fprintf(listing, "<=\n");
break;
case GT: fprintf(listing, ">\n");
break;
case GE: fprintf(listing, ">=\n");
break;
case EQ: fprintf(listing, "==\n");
break;
case NEQ: fprintf(listing, "!=\n");
break;
case AND: fprintf(listing, "&&\n");
break;
case OR: fprintf(listing, "||\n");
break;
case NOT: fprintf(listing, "!\n");
break;
case ASSIGN:fprintf(listing, "=\n");
break;
case SEMI: fprintf(listing, ";\n");
break;
case COMMA: fprintf(listing, ",\n");
break;
case LP: fprintf(listing, "(\n");
break;
case RP: fprintf(listing, ")\n");
break;
case LSP: fprintf(listing, "[\n");
break;
case RSP: fprintf(listing, "]\n");
break;
case LFP: fprintf(listing, "{\n");
break;
case RFP: fprintf(listing, "}\n");
break;
case ENDFILE: fprintf(listing, "EOF\n");
break;
case NUM: fprintf(listing,"[整数] 内容为 %s\n", tokenString);
break;
case FNUM: fprintf(listing,"[实数] 内容为 %s\n", tokenString);
break;
case SCHAR: fprintf(listing,"[字串] 内容为 %s\n", tokenString);
break;
case ID: fprintf(listing,"[标识] 内容为 %s\n", tokenString);
break;
case ERROR: fprintf(listing,"错误: %s\n", tokenString);
break;
default:
fprintf(listing,"未知标记: %d 个\n", token);
}
}
/* 为构建语法树创建新结点 */
TreeNode * newDecNode(DecKind kind)
{
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
if (t==NULL)
fprintf(listing, "内存溢出错误在第 %d 行\n", lineno);
else
{
for (i=0; i<MAXCHILDREN; ++i)
t->child[i] = NULL;
t->sibling = NULL;
t->nodekind = Dec;
t->lineno = lineno;
t->call_stmt= 0;
t->kind.dec = kind;
}
return t;
}
TreeNode * newStmtNode(StmtKind kind)
{
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
if (t==NULL)
fprintf(listing, "内存溢出错误在第 %d 行\n", lineno);
else
{
for (i=0; i<MAXCHILDREN; ++i)
t->child[i] = NULL;
t->sibling = NULL;
t->nodekind = Stmt;
t->lineno = lineno;
t->call_stmt= 0;
t->kind.stmt= kind;
}
return t;
}
TreeNode * newExpNode(ExpKind kind)
{
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
if (t==NULL)
fprintf(listing, "内存溢出错误在第 %d 行\n", lineno);
else
{
for (i=0; i<MAXCHILDREN; ++i)
t->child[i] = NULL;
t->sibling = NULL;
t->nodekind = Exp;
t->lineno = lineno;
t->call_stmt= 0;
t->kind.exp = kind;
}
return t;
}
/* 分配空间,拷贝字串 */
char * copyString(char * s)
{
int n;
char * t;
if (s==NULL)
return NULL;
n = strlen(s)+1;
t = malloc(n);
if (t==NULL)
fprintf(listing, "内存溢出错误在第 %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();
switch (tree->nodekind)
{
case Dec:
switch(tree->kind.dec)
{
case VarK:
fprintf(listing, "标识声明 变量类型: ");
printType(tree->type);
fprintf(listing, "\n");
break;
case FunDecK:
fprintf(listing, "函数声明 名称: %s (返回类型: ", tree->attr.name);
printType(tree->type);
fprintf(listing, ")\n");
break;
case FunDefK:
fprintf(listing, "函数定义 名称: %s (返回类型: ", tree->attr.name);
printType(tree->type);
fprintf(listing,")\n");
break;
case ParamK:
fprintf(listing, "参数声明 参数类型: ");
printType(tree->type);
fprintf(listing, "\n");
break;
case CompK:
fprintf(listing, "复合声明 \n");
break;
}
break;
case Stmt:
switch(tree->kind.stmt)
{
case IfK:
fprintf(listing, "IF\n");
break;
case WhileK:
fprintf(listing, "WHILE\n");
break;
case AssignK:
fprintf(listing, "分配空间\n");
break;
case ReturnK:
fprintf(listing, "RETURN\n");
break;
case CallK:
fprintf(listing, "CALL: %s\n", tree->attr.name);
break;
case ContinueK:
fprintf(listing, "CONTINUE\n");
break;
case BreakK:
fprintf(listing, "BREAK\n");
break;
}
break;
case Exp:
switch(tree->kind.exp)
{
case NumK:
fprintf(listing, "整型常数: %d\n", tree->attr.val.i);
break;
case FnumK:
fprintf(listing, "实型常数: %f\n", tree->attr.val.f);
break;
case CharK:
fprintf(listing, "字符常数: %c\n", tree->attr.val.i);
break;
case IdK:
fprintf(listing, "变量: %s\n", tree->attr.name);
break;
case NotK:
fprintf(listing, "非: \n");
break;
default:
fprintf(listing, "操作符: ");
printToken(tree->attr.op, "\0");
break;
}
break;
default:
fprintf(listing, "未知树节点种类\n");
break;
}
for (i=0; i<MAXCHILDREN; ++i)
printTree(tree->child[i]);
tree = tree->sibling;
}
UNINDENT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -