压缩文法的等价变换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验原理:
所谓有害规则,是指形为U→U的产生式,它对描述语言显然是没有必要的。
所谓多余规则,有两种情况:一种非终结符不在任何产生式右端,这样该产生式无法用到,成为不可到达的。另一种是从某个非终结符无法推出终结符号,称为不可终止的。
实验算法:
有害规则非常好判断,只需判断箭头左右两个字符串是否相等。(注:其实在上下文无关文法中,箭头左边只有一个非终结符,在程序里把它看成字符串而不是单个字符是因为可以直接使用C++语言里的字符串比较函数来判断,省得增加麻烦。)
if(end.contains(s))
return true;
else return false;
}// iscontain()
public boolean isRGPcontain(String s)//正则表达式判断s1是否在END的壁报里面正则忘了怎么写了
{
int length=s.length();
return true;
}//is1
public boolean is2(Noend noend)
{
int length=left.size();
for(int i=0;i<length;i++)来自百度文库
{
String s1=right.get(i);
String s2=left.get(i);
if(noend.iscontain(s2))
}//is3
}//calss produce
public test1()
{
End end=new End();
Noend noend= new Noend();
Produce produce=new Produce();
end.add();
noend.add();
produce.add();
if(produce.is3(noend,end))
{
while(true)
{
String s=JOptionPane.showInputDialog(null,"请输入终结符");
if(s==null)
{break;
}//if
end.add(s);
}//while
}//add()
public boolean iscontain(String s)
{
public boolean iscontain(String s)
{
if(noend.contains(s))
return true;
else return false;
}
public void add()
{
while(true)
{
String s=JOptionPane.showInputDialog(null,"请输入非终结符");
{System.out.println("A->a型");continue;}
int s1length=s1.length();
String left1=s1.substring(0,s1length-2);//A-aB型中的a
String right1=""+s1.charAt(s1length-1);//A-aB型中的B
if(end.isRGPcontain(left1)&&noend.isRGPcontain(right1))
{System.out.println("A-aB型");continue;}
else return false;
}//if
else
return false;
}//for
return true;
for(int i=0;i<length;i++)
{
String a=""+s.charAt(i);
if(end.contains(a))
continue;
else return false;
}//for
return true;
}
}//class end
public class Noend
{
Vector<String> noend=new Vector<String>();
if(s==null)
return;
noend.add(s);
}
}//addendelement()
public boolean isRGPcontain(String s)//正则表达式判断s1是否在END的壁报里面正则忘了怎么写了
{
int length=s.length();
for(int i=0;i<length;i++)
{
JOptionPane.showMessageDialog(null,"是3型文法");
return;
}
if(produce.is2(noend))
{
JOptionPane.showMessageDialog(null,"是2型文法");
return;
}
if(produce.is1())
{
JOptionPane.showMessageDialog(null,"是1型文法");
实验结果:(java)
import java.util.Vector;
import javax.swing.JOptionPane;
public class test1
{
public class End
{
Vector<String> end=new Vector<String>();
public void add()
{
int length=left.size();
for(int i=0;i<length;i++)
{
String s1=right.get(i);
String s2=left.get(i);
if(s1.length()>=s2.length())
continue;
else
return false;
}//for
String ss[]=s.split(" ");
System.out.println("*"+ss[0]+"*");
System.out.println("*"+ss[1]+"*");
left.add(ss[0]);
right.add(ss[1]);
}
}//add()
public boolean is1()
Vector<String> right=new Vector<String>();//生产式的右部
public void add()
{ while(true)
{
String s=JOptionPane.showInputDialog(null,"请输入产生式空格隔开");
if(s==null)
return;
String s2=left.get(i);
System.out.println(s1);
System.out.println(s2);
if(noend.iscontain(s2))//如果左部是一个非终结符
{
if(end.isRGPcontain(s1))//正则表达式判断终结符是否包含s1 A->a型
{
char a=s.charAt(i);
if(noend.contains(a))
continue;
else return false;
}//for
return true;
}
}//class noend
public class Produce
{
Vector<String> left=new Vector<String>();//生产式的左部
continue;
return false;
}//for
return true;
}//is2
public boolean is3(Noend noend,End end)
{
int length=left.size();
for(int i=0;i<length;i++)
{
String s1=right.get(i);
判断不可到达时,将所有产生式右边的非终结符收集起来放进一个数组,再判断左边是否有不含在该数组的非终结符(开始符号S除外),若有,则为不可到达的。
判断不可终止时,先假定所有非终结符都是不可终止的,再扫描所有产生式,若产生式右边不含左边的非终结符,则修改假定为可终止的。
将所有有害规则放在一个数组中,所有不可到达规则放在一个数组中,所有不可终止规则放在一个数组中,最后按实验要求分类列出这些要删除的规则。压缩后的规则从原规则中减去这些规则产生。
return;
}
}
public static void main(String args[])
{
test1 app=new test1();
}
}//class gramemer
课 程 名 称:压缩文法的等价转换
年级/专业/班:11级计算机类(二)班
姓 名:徐勇兵
学 号:E01114278
压缩文法的等价变换
实验目的:
1.了解有关文法的实用限制。
2.实现用计算机判断有害规则和多余规则。
实验要求:
除了可查看压缩了的文法,还可查看删除了哪些规则
输入:任意的上下文无关文法
输出:等价的压缩了的文法
相关文档
最新文档