- 1 -
实验一 文法的机内表示与输入输出
实验题目:文法的机内表示与输入输出
实验目的:输入文法,按照所提供的各种要求输出所需结果。
实验准备:在学习了规则和有关文法的一些基本概念后,用本实验来加深各个概
念间的关系。例如 规则、文法、识别符、Chomsky文法、终结符、非终结符等。
设计考虑:
- 1 -
- 2 -
实验代码:
#include
struct RightNode {
char right;
RightNode* nextsibling; RightNode* nextrule; RightNode(char abc) {
right=abc;
nextsibling=NULL;
nextrule=NULL; } };
struct LeftItem { char left;
RightNode* therule;
};
//////////////////////////////////////////////////////////////////////////////
void Insert(RightNode*& pNode,char* temp) {
pNode=new RightNode(*temp);
RightNode* qNode=pNode;
temp++;
while(*temp!='\\0')
{
qNode->nextsibling=new
RightNode(*temp);
qNode=qNode->nextsibling;
temp++;
}
}
void Bianli1(LeftItem Array[],int length,RightNode*
pNode)
{
RightNode* qNode=pNode->nextrule;
while(pNode!=NULL)
{
for(int i=0;i { - 2 - if(pNode->right==Array[i].left) break; } if(i==length) { for(i=0;i cout< A[t]=pNode->right; t++; } } pNode=pNode->nextsibling; } if(qNode!=NULL) Bianli1(Array,length,qNode); } void Bianli2(RightNode* pNode) { RightNode* qNode=pNode->nextrule; while(pNode!=NULL) { cout< pNode=pNode->nextsibling; } if(qNode!=NULL) { cout<<\ Bianli2(qNode); } } void SelectMenu(LeftItem Array[],int length) { int sel2; do { - 3 - cout<<\请选择您要查询的项目.\ cout<<\查询全体规则请按------> 1\ cout<<\查询指定规则请按------> 2\ cin>>sel2; }while(sel2!=1&&sel2!=2); if(sel2==1) { for(int i=0;i } } else { char temp; int k; cout< for(int i=0;i } } if(i==length) cout<<\本文法规则中没有对应的规则!\ else { cout< } } } ////////////////////////////////////////////////////////////////////////////// - 3 - void main() { char temp[20]; int size=0; int k,sel,m,n,j; cout<<\请输入文法规则的数目:\ cin>>n; LeftItem* Array=new LeftItem[n]; for(int i=0;i cout<<\请输入文法规则:\ cin>>temp; if(*temp==NULL) break; for(j=0;j k=j; break; } } if(j==size) { Array[size].left=*temp; Insert(Array[size].therule,temp+4); size++; } else { RightNode* t=Array[k].therule; while(t->nextrule!=NULL) t=t->nextrule; Insert(t->nextrule,temp+4); } } cout<<\ 文 法 规 则 存 储 毕!\