📄 grammer.cpp
字号:
#include"Grammer.h"
Grammer::Grammer(Token * Token_t):token(Token_t)
{
i_IsDecR=0;
i_IsVarR=0;
i_IsProcR=0;
i_IsBodyR=0;
}
Grammer::~Grammer()
{
Grammer_delete(Gra_root);
}
NameNode * Grammer::Add_name(string name)
{
NameNode * name0=new NameNode;
name0->str_name=name;
name0->NN_next=NULL;
return name0;
}
int Grammer::Grammer_Parse()
{
if(token==NULL)
{
cout<<"Token序列未传至语法分析中"<<endl;
return 0;
}
else
{
Token_curr=token;
Gra_root=new GrammerNode();
Gra_root->child0=NULL;
Gra_root->child1=NULL;
Gra_root->child2=NULL;
Gra_root->Sibling=NULL;
Gra_root->name=NULL;
Gra_root->NK_Nodekind=ProK;
Gra_root->child0=Grammer_ProgramHead();
if(Gra_root->child0==NULL)
return 0;
Gra_root->child1=Grammer_DeclarePart();
if(i_IsDecR<0||i_IsVarR<0||i_IsProcR<0)
return 0;
Gra_root->child2=Grammer_ProgramBody();
if(i_IsBodyR<0)
return 0;
if(Grammer_match()==0)
return 0;
}
return 1;
}
GrammerNode * Grammer::Grammer_ProgramHead()
{
if(Token_curr->str_wom!="program")
{
cout<<"第"<<Token_curr->i_row<<"文件头错误!"<<endl;
return NULL;
}
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!="ID")
{
cout<<"第"<<Token_curr->i_row<<"文件名错误!"<<endl;
return NULL;
}
GrammerNode * Node_ProgramHead_temp;
Node_ProgramHead_temp=new GrammerNode;
Node_ProgramHead_temp->child0=NULL;
Node_ProgramHead_temp->child1=NULL;
Node_ProgramHead_temp->child2=NULL;
Node_ProgramHead_temp->Sibling=NULL;
Node_ProgramHead_temp->name=NULL;
Node_ProgramHead_temp->NK_Nodekind=PheadK;
Node_ProgramHead_temp->name=Add_name(Token_curr->str_grm);
Node_ProgramHead_temp->i_Lineno=Token_curr->i_row;
Token_curr=Token_curr->T_next;
return Node_ProgramHead_temp;
}
GrammerNode * Grammer::Grammer_DeclarePart()
{
GrammerNode * Node_DeclarePart_Type=new GrammerNode;
Node_DeclarePart_Type->child0=NULL;
Node_DeclarePart_Type->child1=NULL;
Node_DeclarePart_Type->child2=NULL;
Node_DeclarePart_Type->Sibling=NULL;
Node_DeclarePart_Type->name=NULL;
GrammerNode * Node_DeclarePart_Var=new GrammerNode;
Node_DeclarePart_Var->child0=NULL;
Node_DeclarePart_Var->child1=NULL;
Node_DeclarePart_Var->child2=NULL;
Node_DeclarePart_Var->Sibling=NULL;
Node_DeclarePart_Var->name=NULL;
Node_DeclarePart_Type->Sibling=Node_DeclarePart_Var;
if(Token_curr->str_wom=="type")
{
Node_DeclarePart_Type->NK_Nodekind=TypeK;
Node_DeclarePart_Type->child0=Grammer_TypeDec();
if(i_IsDecR<0)
return NULL;
}
if(Token_curr->str_wom=="var")
{
Node_DeclarePart_Var->NK_Nodekind=VarK;
Node_DeclarePart_Var->child0=Grammer_VarDec();
if(i_IsVarR<0)
return NULL;
}
if(Token_curr->str_wom=="procedure")
{
Node_DeclarePart_Var->Sibling=Grammer_ProcDec();
if(i_IsProcR<0)
return NULL;
}
return Node_DeclarePart_Type;
}
GrammerNode * Grammer::Grammer_TypeDec()
{
if(Token_curr->str_wom=="type")
{
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom=="ID")
return Grammer_TypeDecList();
}
return NULL;
}
GrammerNode * Grammer::Grammer_TypeDecList()
{
GrammerNode * Node_Declare_TypePart=new GrammerNode;
Node_Declare_TypePart->child0=NULL;
Node_Declare_TypePart->child1=NULL;
Node_Declare_TypePart->child2=NULL;
Node_Declare_TypePart->Sibling=NULL;
Node_Declare_TypePart->name=NULL;
NameNode * NN_Temp;
Node_Declare_TypePart->i_idnum=0;
Node_Declare_TypePart->name=Add_name(Token_curr->str_grm);
Node_Declare_TypePart->i_idnum++;
NN_Temp=Node_Declare_TypePart->name;
Node_Declare_TypePart->i_Lineno=Token_curr->i_row;
Node_Declare_TypePart->NK_Nodekind=DecK;
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!="=")
{
i_IsDecR--;
cout<<"第"<<Token_curr->i_row<<"类型申明出错"<<endl;
return NULL;
}
Token_curr=Token_curr->T_next;
Grammer_TypeDef(Node_Declare_TypePart);
if(Token_curr->str_wom!=";")
{
cout<<"第"<<Token_curr->i_row<<"行缺少;TypeDecList"<<endl;
i_IsDecR--;
}
Token_curr=Token_curr->T_next;
Node_Declare_TypePart->Sibling=Grammer_TypeDecMore();
return Node_Declare_TypePart;
}
GrammerNode * Grammer::Grammer_TypeDecMore()
{
if(Token_curr->str_wom=="ID")
return Grammer_TypeDecList();
return NULL;
}
void Grammer::Grammer_TypeDef(GrammerNode * node_temp)
{
if(Token_curr->str_wom=="integer"||Token_curr->str_wom=="char")
Grammer_BaseType(node_temp);
else if(Token_curr->str_wom=="array"||Token_curr->str_wom=="record")
Grammer_StructType(node_temp);
else if(Token_curr->str_wom=="ID")
{
node_temp->K_kind.dec=IdK;
node_temp->str_type_name=Token_curr->str_grm;
}
Token_curr=Token_curr->T_next;
}
void Grammer::Grammer_BaseType(GrammerNode * node_temp)
{
if(Token_curr->str_wom=="integer")
{
node_temp->K_kind.dec=IntegerK;
}
else if(Token_curr->str_wom=="char")
{
node_temp->K_kind.dec=CharK;
}
}
void Grammer::Grammer_StructType(GrammerNode * node_temp)
{
if(Token_curr->str_wom=="array")
Grammer_ArrayType(node_temp);
else if(Token_curr->str_wom=="record")
{
node_temp->K_kind.dec=RecordK;
Grammer_RecordType(node_temp);
}
}
void Grammer::Grammer_ArrayType(GrammerNode * node_temp)
{
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!="[")
{
i_IsDecR--;
cout<<"第"<<Token_curr->i_row<<"行缺少["<<endl;
return;
}
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!="integer")
{
i_IsDecR--;
cout<<"第"<<Token_curr->i_row<<"行数组申明错误"<<endl;
return;
}
node_temp->at_attr.Array.i_low=TurnToInt(Token_curr->str_wom);
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!="..")
{
i_IsDecR--;
cout<<"第"<<Token_curr->i_row<<"行缺少.."<<endl;
return;
}
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!="integer")
{
i_IsDecR--;
cout<<"第"<<Token_curr->i_row<<"行数组申明错误"<<endl;
return;
}
node_temp->at_attr.Array.i_up=TurnToInt(Token_curr->str_wom);
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!="]")
{
i_IsDecR--;
cout<<"第"<<Token_curr->i_row<<"行缺少]"<<endl;
return;
}
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!="of")
{
i_IsDecR--;
cout<<"第"<<Token_curr->i_row<<"行数组申明错误"<<endl;
return;
}
Token_curr=Token_curr->T_next;
node_temp->K_kind.dec=ArrayK;
if(Token_curr->str_wom=="integer")
node_temp->at_attr.Array.childType=IntegerK;
else if(Token_curr->str_wom=="char")
node_temp->at_attr.Array.childType=CharK;
}
int Grammer::TurnToInt(string str)
{
char b[32];
strcpy(b,str.c_str());
int c;
c=atoi(b);
return c;
}
void Grammer::Grammer_RecordType(GrammerNode * node_temp)
{
node_temp->K_kind.dec=RecordK;
GrammerNode * node_temp0=new GrammerNode;
node_temp0->child0=NULL;
node_temp0->child1=NULL;
node_temp0->child2=NULL;
node_temp0->Sibling=NULL;
node_temp0->name=NULL;
node_temp->child0=node_temp0;
Token_curr=Token_curr->T_next;
Grammer_FieldDecList(node_temp0);
}
void Grammer::Grammer_FieldDecList(GrammerNode * node_temp)
{
if(Token_curr->str_wom=="integer"||Token_curr->str_wom=="char")
{
Grammer_BaseType(node_temp);
Token_curr=Token_curr->T_next;
node_temp->name=Add_name(Token_curr->str_grm);
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!=";")
{
cout<<"第"<<Token_curr->i_row<<"行缺少;FieldDecList"<<endl;
i_IsDecR--;
}
Grammer_FieldDecMore(node_temp);
}
else if(Token_curr->str_wom=="array")
{
Grammer_ArrayType(node_temp);
Grammer_FieldDecMore(node_temp);
}
else if(Token_curr->str_wom=="ID")
{
Grammer_IdList(node_temp);
Grammer_FieldDecMore(node_temp);
}
}
void Grammer::Grammer_IdList(GrammerNode * node_temp)
{
node_temp->K_kind.dec=IdK;
node_temp->str_type_name=Token_curr->str_grm;
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!="ID")
{
cout<<"第"<<Token_curr->i_row<<"行申明错误"<<endl;
i_IsDecR--;
return;
}
node_temp->name=Add_name(Token_curr->str_grm);
Token_curr=Token_curr->T_next;
if(Token_curr->str_wom!=";")
{
cout<<"第"<<Token_curr->i_row<<"行缺少;"<<endl;
i_IsDecR--;
return;
}
}
void Grammer::Grammer_FieldDecMore(GrammerNode * node_temp)
{
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=="ID")
{
GrammerNode * node_temp1=new GrammerNode;
node_temp1->child0=NULL;
node_temp1->child1=NULL;
node_temp1->child2=NULL;
node_temp1->Sibling=NULL;
node_temp1->name=NULL;
node_temp1->Sibling=node_temp;
Grammer_FieldDecList(node_temp1);
return;
}
else if(Token_curr->str_wom=="end")
{
return ;
}
cout<<"第"<<Token_curr->i_row<<"行出现错误"<<endl;
i_IsDecR--;
}
GrammerNode * Grammer::Grammer_VarDec()
{
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();
else
{
i_IsVarR--;
cout<<"第"<<Token_curr->i_row<<"行出错;VarDec"<<endl;
return NULL;
}
}
GrammerNode * Grammer::Grammer_VarDecList()
{
GrammerNode * Node_Declare_VarPart=new GrammerNode;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -