• 大小: 14KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-07-23
  • 语言: 其他
  • 标签:

资源简介

我在学编译原理课的时候编的,把文法写进文件,然后运行程序即可.产生的DFA在屏幕上显示,分析表写到文件里面.

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include “GRAMA.h“

CGRAMA::CGRAMA():start_symbol(-5) //构造函数
{
char *bufch;
List buflist;
int i=0;
ifstream fin(“grama.txt“ios::nocreate); //打开文件
if(!fin){
cout<<“file not found!\n“;
exit(0);
}
fin>>vnnum>>vtnum>>gncount;
vnstring=new char[vnnum];
vtstring=new char[vtnum];
vn=new int[vnnum];
vt=new int[vtnum];
for(i=0;i fin>>vnstring[i];
vn[i]=-10-5*i;
}
for(i=0;i fin>>vtstring[i];
vt[i]=10+5*i;
}
Gener first_gener; //对文法进行拓广
first_gener.vn=start_symbol; //-5是文法开始符号
first_gener.sentence=new int[2];
first_gener.sentence[0]=vn[0];
first_gener.sentence[1]=END;
gn_list.Insert(first_gener);
fin.get(ch);
for(i=0;i while(1){
fin.get(ch);
if(ch==‘\n‘) break;
buflist.Insert(ch);
}
buflist.PutToArray(buf);
buflist.MakeEmpty();
Encode(buf);
}
fin.close();
}

CGRAMA::~CGRAMA() //析构函数
{
gn_list.MakeEmpty();
item_list.MakeEmpty();
convert_list.MakeEmpty();
delete[]vt;
delete[]vn;
delete[]vtstring;
delete[]vnstring;
}

void CGRAMA::Encode(char *&buf)
{
char *pS=buf; //搜索buf字符串的指针
int tempflag(0); //temp是中转变量
Gener generg1g2;
List temp_list;
gener.vn=EncodeVn(*pS); //产生式左部的编码
pS=pS+3; //跳过“->“
int length=::GetStrLen(buf)-3; //length为产生式右部的最大长度
gener.sentence=new int[length+1]; //堆内存分配
for(int i=0;i if((temp=EncodeVt(*pS))==-1)  //若在终结符中找不到就到非终结符中找
temp=EncodeVn(*pS);
gener.sentence[i]=temp; //存入编码值
pS++;
}
gener.sentence[length]=END;
temp_list.Insert(gener);
for(ListNode *p=temp_list.first;p;p=p->link)
{
length=p->data.GetRightLength();
flag=0;
for(i=0;i {
if(p->data.sentence[i]==-1)
{
flag=1;
break;
}
}
g1.vn=p->data.vn;
if(flag==1) g1.sentence=new int[i+1];
else g1.sentence=new int[length];
for(int j=0;j g1.sentence[j]=p->data.sentence[j];
g1.sentence[i]=END;
gn_list.Insert(g1);
if(flag==1){
g2.vn=p->data.vn;
g2.sentence=new int[length-i];
for(j=0;j g2.sentence[j]=p->data.sentence[j+i+1];
g2.sentence[length-i-1]=END;
temp_list.Insert(g2);
}
}
}


int CGRAMA::EncodeVn(char ch) //查找非终结符号表
{
for(int i=0;i if(ch==vnstring[i])
return vn[i];
return -1;
}

int CGRAMA::EncodeVt(char ch) //查找终结符号表
{
for(int i=0;i if(ch==vtstring[i])
return vt[i];
if(ch==‘$‘) return 0;
return -1;
}

char CGRAMA::Decode(int num)
{
char c;int i;
for(i=0;i if(num==vn[i])
return vnstring[i];
for(i=0;i if(num==vt[i])
return vtstring[i];
if(num==-5) c=‘X‘;
if(num==1) c=‘.‘;
if(num==5) c=‘#‘;
if(num==0) c=‘$‘;
return c;
}

void CGRAMA::ToIt

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件          65  2001-12-14 19:51  LALR(1)\grama.txt
     文件        3737  2001-12-06 22:33  LALR(1)\main.dsp
     文件        1147  2001-12-09 12:28  LALR(1)\Gener.h
     文件        1534  2001-12-14 19:38  LALR(1)\GRAMA.h
     文件         531  2001-11-23 12:53  LALR(1)\main.dsw
     文件         542  2001-12-14 19:52  LALR(1)\main.cpp
     文件        3736  2001-12-14 18:04  LALR(1)\List.h
     文件        1612  2001-12-14 18:09  LALR(1)\Item.h
     文件         988  2001-12-15 08:13  LALR(1)\Queue.h
     文件       12262  2001-12-15 11:37  LALR(1)\GRAMA.cpp
     文件       49664  2001-12-15 11:37  LALR(1)\main.opt
     目录           0  2001-12-14 20:49  LALR(1)\

评论

共有 条评论