📄 yufa.cpp
字号:
SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
j=j-(length+1);
NextToken();
Tree->Leftchild=var();
LeftTree=Tree->Leftchild;
LeftTree->father=Tree;
if((strcmp(curToken.name,"=")==0))
{
LeftTree->Rightsibling=sibling1;
sibling1->father=Tree;
sibling1->Leftchild=NULL;
sibling1->FID=23;
sibling1->Node_Number=k++;
sibling1->TOKEN.LineofPro=curToken.LineofPro;
sibling1->TOKEN.code=curToken.code;
strcpy(sibling1->TOKEN.name,curToken.name);
expression_in(curToken.name);//将'='入栈
NextToken();
sibling1->Rightsibling=expression();
sibling2=sibling1->Rightsibling;
sibling2->father=Tree;
sibling2->Rightsibling=NULL;
}
}
else
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
j=j-(length+1);
NextToken();
Tree->Leftchild=simple_expression();
LeftTree=Tree->Leftchild;
LeftTree->father=Tree;
LeftTree->Rightsibling=NULL;
}
}
else error(1,curToken.LineofPro);//缺少"ID"
return Tree;
}
//24.var->ID var1
CTreeNode* var()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=24;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
if(curToken.code==26)//ID
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=LeftTree;
LeftTree->Leftchild=NULL;
LeftTree->father=Tree;
LeftTree->FID=24;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(LeftTree->TOKEN.name,curToken.name);
st_lookup(curToken.name);
if((st_lookup(curToken.name)==1)&&(strcmp(CurToken[j].name,",")!=0)&&(strcmp(CurToken[j].name,")")!=0))
expression_in(curToken.name);//将ID入栈
NextToken();
if((Top_stack==4)&&(strcmp(curToken.name,";")==0))
{
strcpy(ARG1,expression_stack[--Top_stack]);
strcpy(OP,expression_stack[--Top_stack]);
RESULT=lookup(expression_stack[--Top_stack]);
EquPush(OP,ARG1,"\0",RESULT);
strcpy(ARG1,"\0");
strcpy(ARG2,"\0");
strcpy(OP,"\0");
RESULT=0;
}
else
if(strcmp(curToken.name,";")==0)
{
strcpy(ARG1,expression_stack[--Top_stack]);
EquPush(OP,ARG1,"\0",0);
}
LeftTree->Rightsibling=var1();
sibling=LeftTree->Rightsibling;
sibling->father=Tree;
sibling->Rightsibling=NULL;
}
else error(1,curToken.LineofPro);//缺少ID
return Tree;
}
//25.var1->空|[expression]
CTreeNode* var1()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=25;
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->Leftchild=NULL;
LeftTree->father=Tree;
LeftTree->FID=25;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(Tree->TOKEN.name,curToken.name);
NextToken();
LeftTree->Rightsibling=expression();
sibling1=LeftTree->Rightsibling;
sibling1->father=Tree;
if((strcmp(curToken.name,"]"))==0)
{
sibling1->Rightsibling=sibling2;
sibling2->Leftchild=NULL;
sibling2->father=Tree;
sibling2->Rightsibling=NULL;
LeftTree->FID=25;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(Tree->TOKEN.name,curToken.name);
NextToken();
}
else error(3,curToken.LineofPro);//缺少"]"
}
else
Tree->Leftchild=NULL; //空字符处理
return Tree;
}
//26.simple_expression->additive_expression simple_expression1
CTreeNode* simple_expression()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=26;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
Tree->Leftchild=additive_expression();
LeftTree=Tree->Leftchild;
LeftTree->father=Tree;
LeftTree->Rightsibling=simple_expression1();
sibling=LeftTree->Rightsibling;
sibling->father=Tree;
sibling->Rightsibling=NULL;
return Tree;
}
//27.simple_expression1->空字符|relop additive_expression
CTreeNode* simple_expression1()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=27;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
if((curToken.code<17)&&(curToken.code>10))
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=relop();
LeftTree=Tree->Leftchild;
LeftTree->father=Tree;
LeftTree->Rightsibling=additive_expression();
sibling1=LeftTree->Rightsibling;
sibling1->father=Tree;
sibling1->Rightsibling=NULL;
}
else
Tree->Leftchild=NULL;//空字符处理
return Tree;
}
//28.relop-><=|<|>|>=|==|!=
CTreeNode* relop()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=28;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
if((curToken.code==11)||(curToken.code==12)||(curToken.code==13)\
||(curToken.code==14)||(curToken.code==15)||(curToken.code==16))
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=LeftTree;
LeftTree->Leftchild=NULL;
LeftTree->Rightsibling=NULL;
LeftTree->father=Tree;
LeftTree->FID=28;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(LeftTree->TOKEN.name,curToken.name);
expression_in(curToken.name);
NextToken();
}
else error(18,curToken.LineofPro);//缺少比较运算符
return Tree;
}
//29.additive_expression->term additive_expression1
CTreeNode* additive_expression()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=29;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
Tree->Leftchild=term();
LeftTree=Tree->Leftchild;
LeftTree->father=Tree;
LeftTree->Rightsibling=additive_expression1();
sibling=LeftTree->Rightsibling;
sibling->father=Tree;
sibling->Rightsibling=NULL;
return Tree;
}
//30.additive_expressionn1->addop term additive_expression1 |空字符
CTreeNode* additive_expression1()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=30;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
if(((strcmp(curToken.name,"+"))==0)||((strcmp(curToken.name,"-"))==0))
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=addop();
LeftTree=Tree->Leftchild;
LeftTree->father=Tree;
LeftTree->Rightsibling=term();
sibling1=LeftTree->Rightsibling;
sibling1->father=Tree;
sibling1->Rightsibling=additive_expression1();
sibling2=sibling1->Rightsibling;
sibling2->father=Tree;
sibling2->Rightsibling=NULL;
}
else
Tree->Leftchild=NULL;//空字符处理
return Tree;
}
//31.addop->+|-
CTreeNode* addop()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=31;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
if(((strcmp(curToken.name,"+"))==0)||((strcmp(curToken.name,"-")==0)))
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=LeftTree;
LeftTree->Leftchild=NULL;
LeftTree->father=Tree;
LeftTree->Rightsibling=NULL;
LeftTree->FID=31;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(LeftTree->TOKEN.name,curToken.name);
strcpy(OP,curToken.name);
NextToken();
}
else error(14,curToken.LineofPro);//缺少"+"或"-"
return Tree;
}
//32.term->factor term1
CTreeNode* term()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=32;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
Tree->Leftchild=factor();
LeftTree=Tree->Leftchild;
LeftTree->father=Tree;
LeftTree->Rightsibling=term1();
sibling=LeftTree->Rightsibling;
sibling->father=Tree;
sibling->Rightsibling=NULL;
return Tree;
}
//33.term1->mulop factor term1|空字符
CTreeNode* term1()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=33;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
if(((strcmp(curToken.name,"*"))==0)||((strcmp(curToken.name,"/")==0)))
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=mulop();
LeftTree=Tree->Leftchild;
LeftTree->father=Tree;
LeftTree->Rightsibling=factor();
sibling1=LeftTree->Rightsibling;
sibling1->father=Tree;
sibling1->Rightsibling=term1();
sibling2=sibling1->Rightsibling;
sibling2->father=Tree;
sibling2->Rightsibling=NULL;
}
else
Tree->Leftchild=NULL;//空字符处理
return Tree;
}
//34.mulop->*|/
CTreeNode* mulop()
{
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=34;
Tree->Node_Number=k++;
Tree->TOKEN.LineofPro=0;
Tree->TOKEN.code=0;
strcpy(Tree->TOKEN.name,"\0");
if(((strcmp(curToken.name,"*"))==0)||((strcmp(curToken.name,"/")==0)))
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=LeftTree;
LeftTree->Leftchild=NULL;
LeftTree->father=Tree;
LeftTree->Rightsibling=NULL;
LeftTree->FID=34;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(Tree->TOKEN.name,curToken.name);
strcpy(OP,curToken.name);
NextToken();
}
else error(15,curToken.LineofPro);//缺少"*"或"/"
return Tree;
}
//35.factor->(expression)|var|call|NUM
CTreeNode* factor()
{
int length=0,i=0;
char T[10];
SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->FID=35;
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->Leftchild=NULL;
LeftTree->father=Tree;
LeftTree->FID=35;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(LeftTree->TOKEN.name,curToken.name);
NextToken();
LeftTree->Rightsibling=expression();
sibling1=LeftTree->Rightsibling;
sibling1->father=Tree;
if((strcmp(curToken.name,")"))==0)
{
sibling1->Rightsibling=sibling2;
sibling2->Leftchild=NULL;
sibling2->father=Tree;
sibling2->Rightsibling=NULL;
LeftTree->FID=35;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(Tree->TOKEN.name,curToken.name);
NextToken();
}
else error(5,curToken.LineofPro);//缺少")"
}
else
if(curToken.code==27)//NUM
{
SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
Tree->Leftchild=LeftTree;
LeftTree->Leftchild=NULL;
LeftTree->father=Tree;
LeftTree->Rightsibling=NULL;
LeftTree->FID=35;
LeftTree->Node_Number=k++;
LeftTree->TOKEN.LineofPro=curToken.LineofPro;
LeftTree->TOKEN.code=curToken.code;
strcpy(LeftTree->TOKEN.name,curToken.name);
if((Top_stack==4)&&(strcmp(CurToken[j].name,";")==0))
{
strcpy(ARG2,curToken.name);
EquPush(OP,ARG1,ARG2,atoi(T));
}
else
strcpy(ARG1,curToken.name);
NextToken();
if((Top_stack==3)&&(strcmp(curToken.name,")")==0))//处理关系运算
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -