资源简介
我在学编译原理课的时候编的,把文法写进文件,然后运行程序即可.产生的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)\
- 上一篇:基于YCbCr空间的高斯肤色模型的人脸检测
- 下一篇:Acr122u读写软件1.6
评论
共有 条评论