编译原理实验报告1 下载本文

内容发布更新时间 : 2024/12/28 12:00:48星期一 下面是文章的全部内容请认真阅读。

- 1 -

实验一 文法的机内表示与输入输出

实验题目:文法的机内表示与输入输出

实验目的:输入文法,按照所提供的各种要求输出所需结果。

实验准备:在学习了规则和有关文法的一些基本概念后,用本实验来加深各个概

念间的关系。例如 规则、文法、识别符、Chomsky文法、终结符、非终结符等。

设计考虑:

- 1 -

- 2 -

实验代码:

#include int t=0; char A[20]; struct LeftItem;

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;iright==A[i]) break; } if(i==t) { if(i!=0) cout<<\

cout<right;

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<right;

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<>temp;

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<<\

毕!\

cout<<\欢迎进入查询系统!\ aaa: cout<

cout<<\请选择您要查询的项目.\