⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wenfa.txt

📁 "Fine case for the" source code文法的分析!
💻 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 + -