• 大小: 193KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-19
  • 语言: 其他
  • 标签: 编译原理  

资源简介

编译原理实验三:正规文法到正规式的转换,zip文件里包含实验报告和源代码两部分。

资源截图

代码片段和文件信息

#include
#include
using namespace std;

#define max 50
int NONE=1;
string stringsnoendend;//非终结符与终结符存储
int n;//产生式总数

struct Chomsky
{
string left;
string right; 
}; 

void apart(Chomsky *pint i) //分开产生式左右部
{
int j;
    for(j=0;j if(strings[j]==‘-‘)
{
p[i].left=strings.substr(0j);
p[i].right=strings.substr(j+1strings.length()-j);
}
}
void VNVT(Chomsky *p)//求VN和VT
{
int ij;
for(i=0;i {
for(j=0;j<(int)p[i].left.length();j++) 
{
if((p[i].left[j]>=‘A‘&&p[i].left[j]<=‘Z‘))//非终结符判断
{
if(noend.find(p[i].left[j])>100)
noend+=p[i].left[j]; 
}
else
{
if(end.find(p[i].left[j])>100)
end+=p[i].left[j];
}
}
for(j=0;j<(int)p[i].right.length();j++) 
{
if(!(p[i].right[j]>=‘A‘&&p[i].right[j]<=‘Z‘))//终结符判断
{
if(end.find(p[i].right[j])>100)
end+=p[i].right[j];
}
else 
{
if(noend.find(p[i].right[j])>100)
noend+=p[i].right[j];
}
}
}
}

int zero(Chomsky *p)//0型文法
{
int flag(0)count(0);
    int ij;
    for(i=0;i {
for(j=0;j<(int)p[i].left.length();j++)
{
if(p[i].left[j]>=‘A‘&&p[i].left[j]<=‘Z‘) //有否非终结符
flag++;
}
if(flag>0)
{
flag=0;
count++;
}
else 
break; //左部没有非终结符,结束
}
if(count==n) 
return 1; //属于0型文法
else
{
cout< NONE=0;
return 0;
}
}


int one(Chomsky *p)//1型文法
{
int flag(0);
    int i;
    if(zero(p))
{
for(i=0;i {
if(p[i].right.length() {
flag++;
break;
}
}
}
else
flag--;
if(flag>0)
{
cout<        return 0;   //不属于1型文法
}
else 
if(flag==0)
return 1; //属于1型文法
else
return 0;
}


int two(Chomsky *p)//2型文法
{
int flag(0);
    int i;
    if(one(p))
{
for(i=0;i if((p[i].left.length()!=1)||!(p[i].left[0]>=‘A‘&&p[i].left[0]<=‘Z‘)) //左部不属于一个字符或不属于非终结符
{
flag++;
break;
}
}
else
      flag--;
if(flag>0)
{
cout<        return 0;   //不属于2型文法
}
else 
if(flag==0)
{
return 1; //属于2型文法
}
else
return 0;
}


int three(Chomsky *p)//3型文法
{
int flag=0;
int i;
if(two(p))   
{
   for(i=0;i    if(!(p[i].right.length()==1||p[i].right.length()==2)||(p[i].right[0]>=‘A‘&&p[i].right[0]<=‘Z‘)) //右部字符个数不是1或2,或首字符是非终结符
    {
     flag++;
     break;
    }
    else 
     if((p[i].right.length()==2)&&!(p[i].right[1]>=‘A‘&&p[i].right[1]<=‘Z‘)) //第二个字符不是非终结符
      {
       flag++;
       break;
      }
}
else
   flag--;
if(flag>0)
{
   cout<<“此文法属于2型文法,即上下文无关文法。“<   i=n;
   return 0;
}
else 
   if(flag==0)
   {
    cout<<“此文法属于3型文法,即正规文法。“<    return 1;
   }
   else
    return 0; 
}

void change(Chomsky *p)//正规文法到正规式的转换函数
{
int ijmflag;   //合并产生式
for 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        6703  2014-05-07 17:19  3.cpp
     文件      324608  2015-12-13 20:44  编译原理实验三:正规文法到正规式的转换.doc

评论

共有 条评论