📄 yufa.cpp
字号:
}
else error(4,curToken.LineofPro);//缺少"NUM"
}
else
if((strcmp(curToken.name,"("))==0)
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling3=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=LeftTree;
LeftTree->Leftchild=NULL;
LeftTree->father=Tree;
LeftTree->FID=5;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(LeftTree->TOKEN.name,curToken.name);
strcpy(function,variable);
st_insert(function,status,curToken.name);
stack[R++]='(';
NextToken();
LeftTree->Rightsibling=params();
sibling1=LeftTree->Rightsibling;
sibling1->father=Tree;
sibling1=LeftTree->Rightsibling;
if((strcmp(curToken.name,")"))==0)
{
sibling1->Rightsibling=sibling2;
sibling2->Leftchild=NULL;
sibling2->father=Tree;
sibling2->FID=5;
sibling2->Node_Number=k++;
sibling2->TOKEN.LineofPro=curToken.LineofPro;
sibling2->TOKEN.code=curToken.code;
strcpy(sibling2->TOKEN.name,curToken.name);
stack[--R]='\0';
param_number=0;//形参个数置为零
NextToken();
sibling2->Rightsibling=compound_stmt();
sibling3=sibling2->Rightsibling;
sibling3->father=Tree;
sibling3->Rightsibling=NULL;
}
else error(5,curToken.LineofPro);//缺少")"
}
else error(6,curToken.LineofPro);//缺少"("
return Tree;
}
//6.type_specifier->int|void
CTreeNode* type_specifier()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=6;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
if(((strcmp(curToken.name,"int"))==0)||(strcmp(curToken.name,"void")==0))
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=LeftTree;
LeftTree->Leftchild=NULL;
LeftTree->Rightsibling=NULL;
LeftTree->father=Tree;
LeftTree->FID=6;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(LeftTree->TOKEN.name,curToken.name);
strcpy(status,curToken.name);
NextToken();
}
else error(7,curToken.LineofPro);//数据类型丢失
return Tree;
}
//7.params->param_list|void
CTreeNode* params()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=7;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
if((strcmp(curToken.name,"void"))==0)
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=LeftTree;
LeftTree->Leftchild=NULL;
LeftTree->Rightsibling=NULL;
LeftTree->father=Tree;
LeftTree->FID=7;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(LeftTree->TOKEN.name,curToken.name);
NextToken();
}
else
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=param_list();
LeftTree=Tree->Leftchild;
LeftTree->father=Tree;
LeftTree->Rightsibling=NULL;
}
return Tree;
}
//8.param_list->param param_list1
CTreeNode* param_list()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=8;
Tree->Node_Number=k++;
Tree->Leftchild=param();
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
LeftTree=Tree->Leftchild; //处理左孩子的父结点
LeftTree->father=Tree;
LeftTree->Rightsibling=param_list1();
sibling=LeftTree->Rightsibling;
sibling->father=Tree;
sibling->Rightsibling=NULL;
return Tree;
}
//9.param_list1->,param param_list1|空字
CTreeNode* param_list1()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=9;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
if((strcmp(curToken.name,","))==0)
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=LeftTree;
LeftTree->father=Tree;
LeftTree->Leftchild=NULL;
LeftTree->FID=9;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(LeftTree->TOKEN.name,curToken.name);
// st_insert(variable,status,curToken.name);
NextToken();
LeftTree->Rightsibling=param();
sibling1=LeftTree->Rightsibling;
sibling1->father=Tree;
sibling1->Rightsibling=param_list1();
sibling2=sibling1->Rightsibling;
sibling2->father=Tree;
sibling2->Rightsibling=NULL;
}
else
Tree->Leftchild=NULL;
return Tree;
}
//10.param->int ID param1
CTreeNode* param()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=10;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
if((strcmp(curToken.name,"int"))==0)
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=LeftTree;
LeftTree->Leftchild=NULL;
LeftTree->father=Tree;
LeftTree->FID=10;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(LeftTree->TOKEN.name,curToken.name);
strcpy(status,curToken.name);
NextToken();
if(curToken.code==26)//ID
{
LeftTree->Rightsibling=sibling1;
sibling1->Leftchild=NULL;
sibling1->father=Tree;
sibling1->FID=10;
sibling1->Node_Number=k++;
sibling1->TOKEN.LineofPro=curToken.LineofPro;
sibling1->TOKEN.code=curToken.code;
strcpy(sibling1->TOKEN.name,curToken.name);
strcpy(variable,curToken.name);
param_number++;//形参个数加1
NextToken();
st_insert(variable,status,curToken.name);
sibling1->Rightsibling=param1();
sibling2=sibling1->Rightsibling;
sibling2->father=Tree;
sibling2->Rightsibling=NULL;
}
else error(1,curToken.LineofPro);//没有ID
}
else error(7,curToken.LineofPro);//数据类型丢失
return Tree;
}
//11.param1->[]|空字
CTreeNode* param1()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=11;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
if((strcmp(curToken.name,"["))==0)
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=LeftTree;
LeftTree->Leftchild=NULL;
LeftTree->father=Tree;
LeftTree->FID=11;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(LeftTree->TOKEN.name,curToken.name);
NextToken();
if((strcmp(curToken.name,"]"))==0)
{
LeftTree->Rightsibling=sibling1;
sibling1->Leftchild=NULL;
sibling1->father=Tree;
sibling1->Rightsibling=NULL;
LeftTree->FID=11;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(LeftTree->TOKEN.name,curToken.name);
NextToken();
}
else error(3,curToken.LineofPro);//缺少"]"
}
else
Tree->Leftchild=NULL;
return Tree;//空字符处理
}
//12.compound_stmt->{local_declarations statement_list}
CTreeNode* compound_stmt()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=12;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
if((strcmp(curToken.name,"{"))==0)
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling3=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=LeftTree;
LeftTree->Leftchild=NULL;
LeftTree->father=Tree;
LeftTree->FID=12;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(LeftTree->TOKEN.name,curToken.name);
stack[R++]='{';
r++;
if((stack[R]=='{')&&(stack[R-1]=='{'))
Par_number--;
NextToken();
LeftTree->Rightsibling=local_declarations();
sibling1=LeftTree->Rightsibling;
sibling1->father=Tree;
sibling1->Rightsibling=statement_list();
sibling2=sibling1->Rightsibling;
sibling2->father=Tree;
if((strcmp(curToken.name,"}"))==0)
{
sibling2->Rightsibling=sibling3;
sibling3->Leftchild=NULL;
sibling3->Rightsibling=NULL;
sibling3->father=Tree;
sibling3->FID=12;
sibling3->Node_Number=k++;
sibling3->TOKEN.LineofPro=curToken.LineofPro;
sibling3->TOKEN.code=curToken.code;
strcpy(sibling3->TOKEN.name,curToken.name);
Par_number++;
stack[R++]='}';
r--;
local_number=0;
NextToken();
}
else error(8,curToken.LineofPro);//缺少"}"
}
else error(9,curToken.LineofPro);//缺少"{"
return Tree;
}
//13.local_declarations->type_specifier ID local_declarations1|空字
CTreeNode* local_declarations()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=13;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
if(((strcmp(curToken.name,"int"))==0)||(strcmp(curToken.name,"void")==0))
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=type_specifier();
LeftTree=Tree->Leftchild;
LeftTree->father=Tree;
if(curToken.code==26)//ID
{
LeftTree->Rightsibling=sibling1;
sibling1->Leftchild=NULL;
sibling1->father=Tree;
sibling1->FID=13;
sibling1->Node_Number=k++;
sibling1->TOKEN.LineofPro=curToken.LineofPro;
sibling1->TOKEN.code=curToken.code;
strcpy(sibling1->TOKEN.name,curToken.name);
strcpy(variable,curToken.name);
NextToken();
sibling1->Rightsibling=local_declarations1();;
sibling2=sibling1->Rightsibling;
sibling2->father=Tree;
sibling2->Rightsibling=NULL;
}
else error(1,curToken.LineofPro);//语法错误,没有ID
}
else
Tree->Leftchild=NULL;//空字符处理
return Tree;
}
//14.local_declarations1->; local_declarations|[NUM];local_declarations
CTreeNode* local_declarations1()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=14;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
if((strcmp(curToken.name,";"))==0)
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=LeftTree;
LeftTree->father=Tree;
LeftTree->Leftchild=NULL;
LeftTree->FID=14;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(LeftTree->TOKEN.name,curToken.name);
local_number++;
st_insert(variable,status,curToken.name);
NextToken();
LeftTree->Rightsibling=local_declarations();
sibling1=LeftTree->Rightsibling;
sibling1->father=Tree;
sibling1->Rightsibling=NULL;
}
else
if((strcmp(curToken.name,"["))==0)
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling3=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling4=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=LeftTree;
LeftTree->Leftchild=NULL;
LeftTree->father=Tree;
LeftTree->FID=14;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(LeftTree->TOKEN.name,curToken.name);
NextToken();
if(curToken.code==27)//NUM
{
LeftTree->Rightsibling=sibling1;
sibling1->Leftchild=NULL;
sibling1->father=Tree;
sibling1->FID=14;
sibling1->Node_Number=k++;
sibling1->TOKEN.LineofPro=curToken.LineofPro;
sibling1->TOKEN.code=curToken.code;
strcpy(sibling1->TOKEN.name,curToken.name);
NextToken();
if((strcmp(curToken.name,"]"))==0)
{
sibling1->Rightsibling=sibling2;
sibling2->Leftchild=NULL;
sibling2->father=Tree;
sibling2->FID=14;
sibling2->Node_Number=k++;
sibling2->TOKEN.LineofPro=curToken.LineofPro;
sibling2->TOKEN.code=curToken.code;
strcpy(sibling2->TOKEN.name,curToken.name);
NextToken();
if((strcmp(curToken.name,";"))==0)
{
sibling2->Rightsibling=sibling3;
sibling3->Leftchild=NULL;
sibling3->father=Tree;
sibling3->FID=14;
sibling3->Node_Number=k++;
sibling3->TOKEN.LineofPro=curToken.LineofPro;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -