📄 parse.cpp
字号:
t->sibling = NULL;
/* 指定新语法树节点t成员:结点类型nodekind为语句类型StmLK */
t->nodekind = StmLK;
/* 指定新语法树节点t成员:源代码行号lineno为全局变量lineno */
t->lineno = lineno;
t->idnum = 0;
for(i=0;i<10;i++)
{
strcpy(t->name[i],"\0");
t->table[i] = NULL;
}
}
/*函数返回语句类型语法树节点指针t*/
return t;
}
/********************************************************/
/* 函数名 newStmtNode */
/* 功 能 创建语句类型语法树节点函数 */
/* 说 明 该函数为语法树创建一个新的语句类型结点 */
/* 并将语法树节点成员初始化 */
/********************************************************/
Cglobal::TreeNode * Cparse::newStmtNode(StmtKind kind)
{
/* 在内存中动态申请分配单元,返回指向该单元的语法树结点类型指针t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 语法树节点指针t为NULL,未能成功分配内存单元 *
* 将出错信息及行号lineno写入列表文件listing */
if (t==NULL)
{
fprintf(listing,"Out of memory error at line %d\n",lineno);
Error = TRUE;
}
/* 语法树节点指针t不是NULL,成功分配内存单元 */
else {
/* 初始化新语法树节点t各子节点child[i]为NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新语法树节点t兄弟节点sibling为NULL */
t->sibling = NULL;
/* 指定新语法树节点t成员:结点类型nodekind为语句类型StmtK */
t->nodekind = StmtK;
/* 指定新语法树节点t成员:语句类型kind.stmt为函数给定参数kind */
t->kind.stmt = kind;
/* 指定新语法树节点t成员:源代码行号lineno为全局变量lineno */
t->lineno = lineno;
t->idnum = 0;
for(i=0;i<10;i++)
{
strcpy(t->name[i],"\0");
t->table[i] = NULL;
}
}
/* 函数返回语句类型语法树节点指针t */
return t;
}
/********************************************************/
/* 函数名 newExpNode */
/* 功 能 表达式类型语法树节点创建函数 */
/* 说 明 该函数为语法树创建一个新的表达式类型结点 */
/* 并将语法树节点的成员初始化 */
/********************************************************/
Cglobal::TreeNode * Cparse::newExpNode(ExpKind kind)
{
/* 内存中动态申请分配单元,返回指向该单元的语法树节点类型指针t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 语法树节点指针t为NULL,未能成功分配内存单元 *
* 将出错信息及行号lineno写入列表文件listing */
if (t==NULL)
{
fprintf(listing,"Out of memory error at line %d\n",lineno);
Error = TRUE;
}
/* 语法树节点指针t不是NULL,内存单元已经成功分配 */
else {
/* 初始化新语法树节点t各子节点child[i]为NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新语法树节点t兄弟节点sibling为NULL(空) */
t->sibling = NULL;
/* 指定新语法树节点t成员: 结点类型nodekind为表达式类型ExpK */
t->nodekind = ExpK;
/* 指定新语法树节点t成员: 表达式类型kind.exp为函数给定参数kind */
t->kind.exp = kind;
/* 指定新语法树节点t成员: 源代码行号lineno为全局变量lineno */
t->lineno = lineno;
/* 指定新语法树节点t成员: 表达式为变量类型时的变量类型varkind *
/* 为IdV.*/
t->attr.ExpAttr.varkind = IdV;
/* 指定新语法树节点t成员: 类型检查类型type为Void */
t->attr.ExpAttr.type = Void;
for(i=0;i<10;i++)
{
strcpy(t->name[i],"\0");
t->table[i] = NULL;
}
}
/* 函数返回表达式类型语法树结点指针t */
return t;
}
/********************************************************/
/* 函数名 copyString */
/* 功 能 字符串复制函数 */
/* 说 明 该函数为已存在的字串分配内存单元,并将其复制 */
/********************************************************/
char * Cparse::copyString(char * s)
{ int n;
char * t;
/* 函数参数s所给字串为NULL(空), 函数返回NULL */
if (s==NULL) return NULL;
/* 函数参数s所给字串非空,计算字串s长度+1赋给临时变量n */
n = strlen(s)+1;
/* 动态分配内存单元,指定单元长度为n,t为指向该单元的指针 */
t = (char *)malloc(n);
/* 单元指针t为NULL(空),未能成功分配 *
* 将出错信息及行号lineno写入列表文件listing */
if (t==NULL)
{
fprintf(listing,"Out of memory error at line %d\n",lineno);
Error = TRUE;
}
/* 调用库函数string.h,复制给定字串s到新字串单元t */
else strcpy(t,s);
/* 函数返回复制得到的新字串指针t */
return t;
}
/*****************************************************************/
/* 函数名 ReadNextToken */
/* 功 能 将文件tokenlist中的信息作为返回值 */
/* 一般,listing指向标准输出。 */
/* 说 明 返回值为TokenType类型,用于语法分析中 */
/*****************************************************************/
void Cparse::ReadNextToken(TokenType *p)
{
FILE *fp2;
/*按只读方式打开文件*/
fp2=fopen("c:\\Tokenlist","rb");
if (fp2==NULL)
{
printf("cannot create file Tokenlist!\n");
Error = TRUE;
//exit(0);
}
fseek(fp2,fp_num*sizeof(TokenType),0);
fread(p,sizeof(TokenType),1,fp2);
fp_num++;
fclose(fp2);
}
/***********************************************************/
/* 函数名 printTab */
/* 功 能 打印空格 */
/* 说 明 在输出文件中打印个数为参数tabnum的空格 */
/***********************************************************/
void Cparse::printTab(int tabnum)
{
for(int i=0;i<tabnum;i++)
fprintf(listing," ");
}
/********************************************************/
/* 函数名 printSpaces */
/* 功 能 空格打印函数 */
/* 说 明 该函数打印指定数量空格,用于表示子树缩进 */
/********************************************************/
void Cparse::printSpaces(void)
{ int i;
/* 按给定缩进量indentno打印空格进行缩进 *
* 其中缩进量indentno总能保持非负 */
for (i=0;i<indentno;i++)
fprintf(listing," ");
}
/******************************************************/
/* 函数名 printTree */
/* 功 能 把语法树输出,显示在listing文件中 */
/* 说 明 该函数运用了宏来定义增量减量的缩进 */
/******************************************************/
void Cparse::printTree(TreeNode *tree)
{ int i;
/* 增量缩进宏,每次进入语法树节点都进行增量缩进 */
INDENT;
/* 函数参数给定语法树节点指针tree非NULL(空) */
while (tree != NULL)
{
/*打印行号*/
if(tree->lineno==0)
printTab(9);
else
switch((int)(tree->lineno / 10))
{
case 0:
fprintf(listing,"line:%d",tree->lineno);
printTab(3);
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
fprintf(listing,"line:%d",tree->lineno);
printTab(2);
break;
default:
fprintf(listing,"line:%d",tree->lineno);
printTab(1);
}
/* 调用函数printSpaces,打印相应的空格,进行缩进 */
printSpaces();
switch ( tree->nodekind)
{ case ProK :
fprintf(listing,"%s ","ProK"); break;
case PheadK:
{fprintf(listing,"%s ","PheadK");
fprintf(listing,"%s ",tree->name[0]);
}
break;
case DecK:
{ fprintf(listing,"%s ","DecK");
if (tree->attr.ProcAttr.paramt==varparamType )
fprintf(listing,"%s ","var param:");
if (tree->attr.ProcAttr.paramt==valparamType)
fprintf(listing,"%s ","value param:");
switch(tree->kind.dec)
{ case ArrayK:
{
fprintf(listing,"%s ","ArrayK");
fprintf(listing,"%d ",tree->attr.ArrayAttr.up);
fprintf(listing,"%d ",tree->attr.ArrayAttr.low);
if (tree->attr.ArrayAttr.childtype == CharK)
fprintf(listing,"%s ","Chark");
else if( tree->attr.ArrayAttr.childtype == IntegerK)
fprintf(listing,"%s ","IntegerK");
};break;
case CharK:
fprintf(listing,"%s ","CharK");break;
case IntegerK:
fprintf(listing,"%s ","IntegerK");break;
case RecordK:
fprintf(listing,"%s ","RecordK");break;
case IdK:
fprintf(listing,"%s ","IdK");
fprintf(listing,"%s ",tree->attr.type_name);
break;
default:
fprintf(listing,"error1!");
Error = TRUE;
};
if (tree->idnum !=0)
for (int i=0 ; i <= (tree->idnum);i++)
{
fprintf(listing,"%s ",tree->name[i]);
}
else
{
fprintf(listing,"wrong!no var!\n");
Error = TRUE;
}
} break;
case TypeK:
fprintf(listing,"%s ","TypeK");break;
case VarK:
fprintf(listing,"%s ","VarK");
if(tree->table[0]!=NULL)
fprintf(listing,"%d %d ",tree->table[0]->attrIR.More.VarAttr.off,tree->table[0]->attrIR.More.VarAttr.level);
break;
case ProcDecK:
fprintf(listing,"%s ","ProcDecK");
fprintf(listing,"%s ",tree->name[0]);
if(tree->table[0]!=NULL)
fprintf(listing,"%d %d %d ",tree->table[0]->attrIR.More.ProcAttr.mOff,tree->table[0]->attrIR.More.ProcAttr.nOff,tree->table[0]->attrIR.More.ProcAttr.level);
break;
case StmLK:
fprintf(listing,"%s ","StmLk");break;
case StmtK:
{ fprintf(listing,"%s ","StmtK");
switch (tree->kind.stmt)
{ case IfK:
fprintf(listing,"%s ","If");break;
case WhileK:
fprintf(listing,"%s ","While");break;
case AssignK:
fprintf(listing,"%s ","Assign");
break;
case ReadK:
fprintf(listing,"%s ","Read");
fprintf(listing,"%s " , tree->name[0]);
if(tree->table[0]!=NULL)
fprintf(listing,"%d %d ",tree->table[0]->attrIR.More.VarAttr.off,tree->table[0]->attrIR.More.VarAttr.level);
break;
case WriteK:
fprintf(listing,"%s ","Write");break;
case CallK:
fprintf(listing,"%s ","Call");
fprintf(listing,"%s ", tree->name[0]);
break;
case ReturnK:
fprintf(listing,"%s ","Return");break;
default:
fprintf(listing,"error2!");
Error = TRUE;
}
};break;
case ExpK:
{ fprintf(listing,"%s ","ExpK");
switch (tree->kind.exp)
{ case OpK:
{ fprintf(listing,"%s ","Op");
switch(tree->attr.ExpAttr.op)
{ case EQ: fprintf(listing,"%s " , "="); break;
case LT: fprintf(listing,"%s " , "<"); break;
case PLUS: fprintf(listing,"%s " , "+"); break;
case MINUS:fprintf(listing,"%s " , "-"); break;
case TIMES:fprintf(listing,"%s " , "*"); break;
case OVER: fprintf(listing,"%s " , "/"); break;
default:
fprintf(listing,"error3!");
Error = TRUE;
}
if(tree->attr.ExpAttr.varkind==ArrayMembV)
{
fprintf(listing,"ArrayMember ");
fprintf(listing,"%s ",tree->name[0]);
}
};break;
case ConstK:
fprintf(listing,"%s ","Const");
switch(tree->attr.ExpAttr.varkind)
{
case IdV:
fprintf(listing,"Id ");
fprintf(listing,"%s ",tree->name[0]);
break;
case FieldMembV:
fprintf(listing,"FieldMember ");
fprintf(listing,"%s ",tree->name[0]);
break;
case ArrayMembV:
fprintf(listing,"ArrayMember ");
fprintf(listing,"%s ",tree->name[0]);
break;
default:
fprintf(listing,"var type error!");
Error = TRUE;
}
fprintf(listing,"%d ",tree->attr.ExpAttr.val);
break;
case VariK:
fprintf(listing,"%s ","Vari");
switch(tree->attr.ExpAttr.varkind)
{
case IdV:
fprintf(listing,"Id ");
fprintf(listing,"%s ",tree->name[0]);
break;
case FieldMembV:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -