📄 grammer.cpp
字号:
Node_Declare_VarPart->child0=NULL;
Node_Declare_VarPart->child1=NULL;
Node_Declare_VarPart->child2=NULL;
Node_Declare_VarPart->Sibling=NULL;
Node_Declare_VarPart->name=NULL;
Node_Declare_VarPart->i_idnum=0;
Node_Declare_VarPart->i_Lineno=Token_curr->i_row;
Node_Declare_VarPart->NK_Nodekind=DecK;
Grammer_TypeDef(Node_Declare_VarPart);
Grammer_VarIdList(Node_Declare_VarPart);
if(Token_curr->str_wom==";")
Node_Declare_VarPart->Sibling=Grammer_VarDecMore();
else
{
i_IsVarR--;
cout<<"第"<<Token_curr->i_row<<"行缺少;"<<endl;
return NULL;
}
return Node_Declare_VarPart;
}
void Grammer::Grammer_VarIdList(GrammerNode* node_temp)
{
if(Token_curr->str_wom!="ID")
return;
else
{
node_temp->name=Add_name(Token_curr->str_grm);
Token_curr=Token_curr->T_next;
Grammer_VarIDMore(node_temp);
}
}
void Grammer::Grammer_VarIDMore(GrammerNode* node_temp)
{
if(Token_curr->str_wom!=",")
return ;
Token_curr=Token_curr->T_next;
NameNode * NN_Temp=node_temp->name;
while(NN_Temp->NN_next!=NULL)
NN_Temp=NN_Temp->NN_next;
NN_Temp->NN_next=Add_name(Token_curr->str_grm);
node_temp->i_idnum++;
Token_curr=Token_curr->T_next;
}
GrammerNode* Grammer::Grammer_VarDecMore()
{
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom=="integer"||Token_curr->str_wom=="char"||Token_curr->str_wom=="array"||Token_curr->str_wom=="record"||Token_curr->str_wom=="ID")
return Grammer_VarDecList();
return NULL;
}
GrammerNode * Grammer::Grammer_ProcDec()
{
if(Token_curr->str_wom=="procedure")
{
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom=="ID")
return Grammer_ProcDeclaration();
}
return NULL;
}
GrammerNode * Grammer::Grammer_ProcDeclaration()
{
GrammerNode * Node_Declare_ProcPart=new GrammerNode;
Node_Declare_ProcPart->child0=NULL;
Node_Declare_ProcPart->child1=NULL;
Node_Declare_ProcPart->child2=NULL;
Node_Declare_ProcPart->Sibling=NULL;
Node_Declare_ProcPart->name=NULL;
Node_Declare_ProcPart->i_idnum=0;
Node_Declare_ProcPart->name=Add_name(Token_curr->str_grm);
Node_Declare_ProcPart->i_idnum++;
Node_Declare_ProcPart->i_Lineno=Token_curr->i_row;
Node_Declare_ProcPart->NK_Nodekind=ProcDecK;
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!="(")
{
i_IsProcR--;
cout<<"第"<<Token_curr->i_row<<"类型申明出错,缺少左括号"<<endl;
return NULL;
}
Grammer_ParamList(Node_Declare_ProcPart);
if(i_IsBodyR<0)
return NULL;
Node_Declare_ProcPart->child1=Grammer_ProcDecPart();
Node_Declare_ProcPart->child2=Grammer_procBody();
return Node_Declare_ProcPart;
}
void Grammer::Grammer_ParamList(GrammerNode* node_temp)
{
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom==")")
return ;
else if(Token_curr->str_wom=="integer"||Token_curr->str_wom=="char"||Token_curr->str_wom=="record"||Token_curr->str_wom=="ID"||Token_curr->str_wom=="var")
node_temp->child0=Grammer_ParamDecList();
Token_curr=Token_curr->T_next;
Token_curr=Token_curr->T_next;
}
GrammerNode* Grammer::Grammer_ParamDecList()
{
GrammerNode* temp=new GrammerNode();
temp->child0=NULL;
temp->child1=NULL;
temp->child2=NULL;
temp->Sibling=NULL;
temp->name=NULL;
temp->i_idnum=0;
temp->i_Lineno=Token_curr->i_row;
temp->NK_Nodekind=DecK;
Grammer_Param(temp);
temp->Sibling=Grammer_ParamMore();
if(Token_curr->str_wom==")")
{
return temp;
}
i_IsProcR--;
cout<<"第"<<Token_curr->i_row<<"行缺少( ParamDecList"<<endl;
return NULL;
}
void Grammer::Grammer_Param(GrammerNode* node_temp)
{
if(Token_curr->str_wom=="integer"||Token_curr->str_wom=="char"||Token_curr->str_wom=="record"||Token_curr->str_wom=="ID")
{
node_temp->at_attr.Proc.PT_param=valparamtype;
Grammer_TypeDef(node_temp);
Grammer_FormList(node_temp);
return;
}
else if(Token_curr->str_wom=="var")
{
node_temp->at_attr.Proc.PT_param=varparamtype;
Token_curr=Token_curr->T_next;
Grammer_TypeDef(node_temp);
Grammer_FormList(node_temp);
return ;
}
if(Token_curr->str_wom!=")")
Token_curr=Token_curr->T_next;
}
void Grammer::Grammer_FormList(GrammerNode* node_temp)
{
if(Token_curr->str_wom!="ID")
{
i_IsProcR--;
cout<<"第"<<Token_curr->i_row<<"行参数申明出错"<<endl;
return;
}
NameNode * NN_Temp=&*(node_temp->name);
if(NN_Temp!=NULL)
{
while(NN_Temp->NN_next!=NULL)
NN_Temp=NN_Temp->NN_next;
NN_Temp->NN_next=Add_name(Token_curr->str_grm);
}
else
{
node_temp->name=Add_name(Token_curr->str_grm);
}
node_temp->i_idnum++;
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom==",")
{
Token_curr=Token_curr->T_next;
Grammer_FormList(node_temp);
}
return ;
}
GrammerNode* Grammer::Grammer_ParamMore()
{
if(Token_curr->str_wom!=";")
return NULL;
Token_curr=Token_curr->T_next;
return Grammer_ParamDecList();
}
GrammerNode* Grammer::Grammer_ProcDecPart()
{
if(Token_curr->str_wom=="begin")
return NULL;
return Grammer_DeclarePart();
}
GrammerNode* Grammer::Grammer_procBody()
{
return Grammer_ProgramBody();
}
GrammerNode* Grammer::Grammer_ProgramBody()
{
if(Token_curr->str_wom!="begin")
return NULL;
GrammerNode* temp=new GrammerNode();
temp->child0=NULL;
temp->child1=NULL;
temp->child2=NULL;
temp->Sibling=NULL;
temp->name=NULL;
temp->i_idnum=0;
temp->i_Lineno=Token_curr->i_row;
temp->NK_Nodekind=StmLK;
Token_curr=Token_curr->T_next;
temp->child0=Grammer_StmList();
if(Token_curr->str_wom!="end")
{
i_IsBodyR--;
cout<<"第"<<Token_curr->i_row<<"行缺少end"<<endl;
return NULL;
}
Token_curr=Token_curr->T_next;
return temp;
}
GrammerNode* Grammer::Grammer_StmList()
{
GrammerNode* temp=new GrammerNode();
temp->child0=NULL;
temp->child1=NULL;
temp->child2=NULL;
temp->Sibling=NULL;
temp->name=NULL;
temp->i_idnum=0;
temp->i_Lineno=Token_curr->i_row;
temp->NK_Nodekind=StmtK;
Grammer_Stm(temp);
if(i_IsBodyR<0)
return NULL;
temp->Sibling=Grammer_StmMore();
return temp;
}
GrammerNode* Grammer::Grammer_StmMore()
{
if(Token_curr->str_wom!=";")
return NULL;
Token_curr=Token_curr->T_next;
return Grammer_StmList();
}
void Grammer::Grammer_Stm(GrammerNode* node_temp)
{
if(Token_curr->str_wom=="if")
Grammer_ConditionalStm(node_temp);
else if(Token_curr->str_wom=="while")
Grammer_LoopStm(node_temp);
else if(Token_curr->str_wom=="return")
Grammer_ReturnStm(node_temp);
else if(Token_curr->str_wom=="read")
Grammer_InputStm(node_temp);
else if(Token_curr->str_wom=="write")
Grammer_OutputStm(node_temp);
else if(Token_curr->str_wom=="ID")
Grammer_AssCall(node_temp);
else
{
i_IsBodyR--;
cout<<"第"<<Token_curr->i_row<<"行出现错误"<<endl;
Token_curr=Token_curr->T_next;
return;
}
}
void Grammer::Grammer_AssCall(GrammerNode* node_temp)
{
//string str_temp=Token_curr->str_grm;
GrammerNode* temp=new GrammerNode();
temp->child0=NULL;
temp->child1=NULL;
temp->child2=NULL;
temp->Sibling=NULL;
temp->name=NULL;
temp->i_idnum=0;
temp->i_Lineno=Token_curr->i_row;
temp->NK_Nodekind=ExpK;
Grammer_variable(temp);
temp->K_kind.exp=IdK;
node_temp->child0=temp;
if(Token_curr->str_wom==":=")
{
node_temp->K_kind.stmt=AssignK;
Grammer_AssignmentRest(node_temp);
}
else if(Token_curr->str_wom=="(")
{
node_temp->K_kind.stmt=CallK;
Grammer_CallStmRest(node_temp);
}
else
{
i_IsBodyR--;
cout<<"第"<<Token_curr->i_row<<"行出现错误"<<endl;
Token_curr=Token_curr->T_next;
return;
}
}
void Grammer::Grammer_AssignmentRest(GrammerNode* node_temp)
{
Token_curr=Token_curr->T_next;
node_temp->child1=Grammer_Exp();
}
void Grammer::Grammer_ConditionalStm(GrammerNode* node_temp)
{
node_temp->K_kind.stmt=IfK;
Token_curr=Token_curr->T_next;
node_temp->child0=Grammer_Exp();
if(i_IsBodyR<0)
return;
if(Token_curr->str_wom=="then")
{
Token_curr=Token_curr->T_next;
node_temp->child1=Grammer_StmList();
}
if(Token_curr->str_wom=="else")
{
Token_curr=Token_curr->T_next;
node_temp->child2=Grammer_StmList();
}
if(Token_curr->str_wom!="fi")
{
i_IsBodyR--;
cout<<"第"<<Token_curr->i_row<<"行缺少fi"<<endl;
return;
}
Token_curr=Token_curr->T_next;
}
void Grammer::Grammer_LoopStm(GrammerNode* node_temp)
{
node_temp->K_kind.stmt=WhileK;
Token_curr=Token_curr->T_next;
node_temp->child0=Grammer_Exp();
if(i_IsBodyR<0)
return;
if(Token_curr->str_wom=="do")
{
Token_curr=Token_curr->T_next;
node_temp->child1=Grammer_StmList();
}
if(Token_curr->str_wom!="endwh")
{
i_IsBodyR--;
cout<<"第"<<Token_curr->i_row<<"行缺少endwh"<<endl;
return;
}
Token_curr=Token_curr->T_next;
}
void Grammer::Grammer_InputStm(GrammerNode* node_temp)
{
node_temp->K_kind.stmt=ReadK;
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!="(")
{
i_IsBodyR--;
cout<<"第"<<Token_curr->i_row<<"行缺少("<<endl;
return;
}
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!="ID")
{
i_IsBodyR--;
cout<<"第"<<Token_curr->i_row<<"行缺少标示符"<<endl;
return;
}
node_temp->name=Add_name(Token_curr->str_grm);
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!=")")
{
i_IsBodyR--;
cout<<"第"<<Token_curr->i_row<<"行缺少)"<<endl;
return;
}
Token_curr=Token_curr->T_next;
}
void Grammer::Grammer_OutputStm(GrammerNode* node_temp)
{
node_temp->K_kind.stmt=WriteK;
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!="(")
{
i_IsBodyR--;
cout<<"第"<<Token_curr->i_row<<"行缺少("<<endl;
return;
}
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!="ID")
{
i_IsBodyR--;
cout<<"第"<<Token_curr->i_row<<"行缺少标示符"<<endl;
return;
}
node_temp->child0=Grammer_Exp();
if(Token_curr->str_wom!=")")
{
i_IsBodyR--;
cout<<"第"<<Token_curr->i_row<<"行缺少)"<<endl;
return;
}
Token_curr=Token_curr->T_next;
}
void Grammer::Grammer_ReturnStm(GrammerNode* node_temp)
{
node_temp->K_kind.stmt=ReturnK;
Token_curr=Token_curr->T_next;
}
void Grammer::Grammer_CallStmRest(GrammerNode* node_temp)
{
Token_curr=Token_curr->T_next;
node_temp->child1=Grammer_ActParamList();
if(i_IsBodyR<0)
return;
if(Token_curr->str_wom!=")")
{
i_IsBodyR--;
cout<<"第"<<Token_curr->i_row<<"行缺少)"<<endl;
return;
}
Token_curr=Token_curr->T_next;
}
GrammerNode* Grammer::Grammer_ActParamList()
{
if(Token_curr->str_wom==")")
return NULL;
GrammerNode* temp;
if(Token_curr->str_wom=="ID"||Token_curr->str_wom=="integer")
{
temp=Grammer_Exp();
temp->Sibling=Grammer_ActParamMore();
return temp;
}
return NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -