📄 wenfa.txt
字号:
package 编译原理;
import java.util.StringTokenizer;
import java.util.Stack;
import java.util.regex.PatternSyntaxException;
public class wenfa
{
String regvt="[abcdefghijklmnopqrstuvwxyz+-*/^&%<>={}()[],0-9]";//文法的终结符
String regvn="[A-Z]";//文法非终结符
String regkong="#";//用#代表文法中的空
//三型文法表达式
String reg3right="[ABCDEFGHIJKLMNOPQRSTUVWXYZ]?[abcdefghijklmnopqrstuvwxyz()+-/<>0-9]";
String reg3left="[0-9abcdefghijklmnopqrstuvwxyz+-<>()][ABCDEFGHIJKLMNOPQRSTUVWXYZ]?";
//二型文法表达式,二型文法是每个表达式左部都为非终结符,右部属于终结符或者非终结符
String reg2="[a-zA-Z<>+=/*()[,]{%}1-9]+";
//1型文法的表达式,即表达式左边至少有一个非终结符,右部的长度大于左部
String reg1="[a-zA-Z<>+=/*()[,]{%}1-9]+";
String regvn1="[A-Z][a-z]*";
//---------------------------------------------------------
String s;
Stack left=new Stack();
Stack right=new Stack();
String text;
public wenfa(String str)
{
s=str;
boolean flag = true;
StringTokenizer fen1=new StringTokenizer(s,"\n");
while(fen1.hasMoreTokens())
{ String s1=(String)fen1.nextToken();
StringTokenizer fen2=new StringTokenizer(s1,"=");
left.push(fen2.nextToken());
right.push(fen2.nextToken());
flag=flag&panduanwenfa3left(left.pop().toString(),right.pop().toString());
}
if(flag==true)
{
setText("此文法为左三型文法");
}
else
{
boolean flag1=true;
StringTokenizer fen11=new StringTokenizer(s,"\n");
while(fen11.hasMoreTokens())
{ String s1=(String)fen11.nextToken();
StringTokenizer fen2=new StringTokenizer(s1,"=");
left.push(fen2.nextToken());
right.push(fen2.nextToken());
flag1=flag1&panduanwenfa3right(left.pop().toString(),right.pop().toString());
}
if(flag1==true)
{
setText("此文法为右三型文法");
}
else//如果不是三型文法判断是不是二型
{
boolean flag2=true;
StringTokenizer fen2=new StringTokenizer(s,"\n");
while(fen2.hasMoreTokens())
{ String s1=(String)fen2.nextToken();
StringTokenizer fen3=new StringTokenizer(s1,"=");
left.push(fen3.nextToken());
right.push(fen3.nextToken());
flag2=flag2&puanduanwenfa2(left.pop().toString(),right.pop().toString());
}
if(flag2==true)
{
setText("此文法为二型文法");
}
else//判断是否为1型文法
{
boolean flag3=true;
StringTokenizer fen3=new StringTokenizer(s,"\n");
while(fen3.hasMoreTokens())
{ String s1=(String)fen3.nextToken();
StringTokenizer fen4=new StringTokenizer(s1,"=");
left.push(fen4.nextToken());
right.push(fen4.nextToken());
flag3=flag3&puanduanwenfa1(left.pop().toString(),right.pop().toString());
}
if(flag3==true)
{
setText("此文法为一型文法");
}
else//不是一型文法判断是否为0型
{
setText("此文法不是文法");
}
}
}
}
}
public void setText(String ss)
{
text=ss;
}
public String gettext()
{
return text;
}
private boolean puanduanwenfa1(String left, String right) {
boolean flag=true;
try{
if(left.matches(reg1)&&right.matches(reg1)&&left.length()<=right.length()||left.matches(reg1)&&right.matches(regkong))
{
flag=true;
}
else
{
flag=false;
}
}catch(PatternSyntaxException e)
{
setText("判断一型文法时发生异常,没有匹配的");
}
return flag;
}
private boolean puanduanwenfa2(String left, String right) {
boolean flag=true;
try
{
if(left.matches(regvn)&&right.matches(reg2))
{
flag=true;
}
else
{
flag=false;
}
}catch(PatternSyntaxException e){
setText("判断二型时发生异常,没有匹配的");}
return flag;
}
private boolean panduanwenfa3right(String left, String right) {
boolean flag=true;
try{//aB
if(left.matches(regvn)&&right.matches(reg3right))//左部符合三型的左部为非终结符的规则和又不规则
{
flag=true;
}
else
{ flag=false;}
}catch(PatternSyntaxException e)
{
setText("判断三型文法时发生异常,没有匹配的");
}
return flag;
}
private boolean panduanwenfa3left(String left, String right) {
boolean flag=true;
try{//aB
if(left.matches(regvn)&&right.matches(reg3left))//左部符合三型的左部为非终结符的规则和又不规则
{
flag=true;
}
else
{ flag=false;}
}catch(PatternSyntaxException e)
{
setText("发生异常,没有匹配的");
}
return flag;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -