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

📄 ptree.java

📁 一个简单的文法分析算法
💻 JAVA
字号:
import java.io.*;
import java.awt.*;
import javax.swing.*;
public class PTree 
{
   private Node root;
   private int type;
   private int number=1;
   
   
   
   public PTree()
   {
       root=null;
    }
   public void BuildTree(LinkNode[] link)
   {
     String string=" ";
     Node temp;
     char[] c;
     if(link!=null)
     {
     root=new Node(link[0].getRoot().getNString());
     System.out.println("选择一种推导方式:");
     System.out.println("1:最左推导  2:最右推导  3:一般推导 ");
     System.out.print("选择:");
     try{
            BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
            string=in.readLine();
            
          }catch(IOException e){}
        c=string.toCharArray();
       if(c[0]=='1')
       {
           System.out.println(root.getString());
           goLeft(root,link);   
           type=1;
        }
        if(c[0]=='2')
       {
           System.out.println(root.getString());
            goRight(root,link);   
           type=2;
        }
        if(c[0]=='3')
       {
           System.out.println(root.getString());
            goRandom(root,link);   
           type=3;
        }
    }
    }   
        
        public void goLeft(Node Root,LinkNode[] link)
        {
            String string=" ";
            int m=-1,n=0;
            char[] temp1,temp2;
            char[] pr;
            Node temp;
            if(Root==null) ;
            else if(Root.getString().toCharArray()[0]!=NewString.ending &&Root.getString().toCharArray()[0]!='+'&&Root.getString().toCharArray()[0]!='-'&&Root.getString().toCharArray()[0]!='*'&&Root.getString().toCharArray()[0]!='/')
           { 
          if(n!=1)
              {
                  Root.setVisit(1);
                 temp1=Root.getString().toCharArray();
                 for(int i=0;i<link.length;i++)
             {
             temp2=link[i].getRoot().getString().toCharArray();
                   if(temp1[0]==temp2[0])  n=i;
                }
                
                temp=link[n].getRoot();
           System.out.println();
           System.out.println("选择一个推导的右部:");
             for(int i=1;i<temp.findAdj().length;i++)
                System.out.print((i)+": "+temp.findAdj()[i].getString()+"  ");
              try{
            BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
            string=in.readLine();
            
          }catch(IOException e){}
             m=StringToInt(string);
         if(temp.getIndexAdj(m).getString().length()==2) 
            {
                Node o=new Node(temp.getIndexAdj(m).getIndexAdj(1).getNString());   
                Root.setChild(o,null,null);
                number++;
                
            }
            else   
            {
                Node o=new Node(temp.getIndexAdj(m).getIndexAdj(1).getNString());
                Node o1=new Node(temp.getIndexAdj(m).getIndexAdj(2).getNString());
                Node o2=new Node(temp.getIndexAdj(m).getIndexAdj(3).getNString());
                Root.setChild(o,o1,o2);
                number=number+3;
                
                
            }
         PrintTree(root);
      
              goLeft(Root.getLeft(),link);
           goLeft(Root.getRight(),link);
            }
            }
           
       }
     
         public void goRight(Node Root,LinkNode[] link)
        {
            String string=" ";
            int m=-1,n=0;
            char[] temp1,temp2;
            char[] pr;
           Node temp;
            if(Root==null) ;
            else if(Root.getString().toCharArray()[0]!=NewString.ending&&Root.getString().toCharArray()[0]!='+'&&Root.getString().toCharArray()[0]!='-'&&Root.getString().toCharArray()[0]!='*'&&Root.getString().toCharArray()[0]!='/')
           { 
              if(n!=1)
              {
                Root.setVisit(1);
                 temp1=Root.getString().toCharArray();
            for(int i=0;i<link.length;i++)
             {
                 temp2=link[i].getRoot().getString().toCharArray();
                 if(temp1[0]==temp2[0])  n=i;
                }
                
                temp=link[n].getRoot();
           System.out.println();
           System.out.println("选择一个推导的右部:");
             for(int i=1;i<temp.findAdj().length;i++)
                System.out.print((i)+": "+temp.findAdj()[i].getString()+"  ");
              try{
            BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
            string=in.readLine();
            
          }catch(IOException e){}
             m=StringToInt(string);
             
            if(temp.getIndexAdj(m).getString().length()==2) 
            {
                Node o=new Node(temp.getIndexAdj(m).getIndexAdj(1).getNString());   
                Root.setChild(null,null,o);
                number++;
                
            }
            else   
            {
                Node o=new Node(temp.getIndexAdj(m).getIndexAdj(1).getNString());
                Node o1=new Node(temp.getIndexAdj(m).getIndexAdj(2).getNString());
                Node o2=new Node(temp.getIndexAdj(m).getIndexAdj(3).getNString());
                Root.setChild(o,o1,o2);
                number=number+3;
                
                
            }
            PrintTree(root);
        
              goRight(Root.getRight(),link);
              goRight(Root.getLeft(),link);
            }
            }
           
       }
       
       public void goRandom(Node Root,LinkNode[] link)
        {
            String string=" ";
            int m=-1,n=0;
            char[] temp1,temp2;
            char[] pr;
            
            Node temp;
          pr=new char[2];
          pr[0]=' ';
            if(Root==null) ;
            else if(Root.getString().toCharArray()[0]!=NewString.ending &&Root.getString().toCharArray()[0]!='+'&&Root.getString().toCharArray()[0]!='-'&&Root.getString().toCharArray()[0]!='*'&&Root.getString().toCharArray()[0]!='/')
           { 
              Root.setVisit(1);
                 temp1=Root.getString().toCharArray();
            for(int i=0;i<link.length;i++)
             {
                  temp2=link[i].getRoot().getString().toCharArray();
                if(temp1[0]==temp2[0])  n=i;
                 }
                
                temp=link[n].getRoot();
               if(Root.getHead()!=0)
               {
                
                System.out.println();
                System.out.println("选择一种推导方式:");
                
                for(int i=0;i<temp.getString().length();i++)
                System.out.println("1:左推导  2:右推导  ");
                System.out.print("选择:");
                    try{
                        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
                        string=in.readLine();
            
                    }catch(IOException e){}
                pr=string.toCharArray();
            }
          if(Root.getLeft()!=null&&Root.getRight()!=null)
           {
           System.out.println();
           System.out.println("选择一个推导的右部:");
             for(int i=1;i<2;i++)
               {
                   m=StringToInt(string);
                   System.out.print((i)+": "+temp.getIndexAdj(m).findAdj()[i].getString()+"  ");//&&*^*%
                   
            }
        }
            if(Root.getLeft()==null||Root.getRight()==null)
            {
                 System.out.println();
           System.out.println("选择一个推导的右部:");
             for(int i=1;i<temp.findAdj().length;i++)
               {
                   m=StringToInt(string);
                   System.out.print((i)+": "+temp.findAdj()[i].getString()+"  ");
                   
            }  
                
                
            }
              try{
            BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
            string=in.readLine();
            
          }catch(IOException e){}
             m=StringToInt(string);
             
            if(temp.getIndexAdj(m).getString().length()==2) 
            {
                Node o=new Node(temp.getIndexAdj(m).getIndexAdj(1).getNString());   
                if(pr[0]=='1')  Root.setChild(o,null,null);
                else if(pr[0]=='2')  Root.setChild(null,null,o);
                else ;
                number++;
                
            }
            else   
            {
                Node o=new Node(temp.getIndexAdj(m).getIndexAdj(1).getNString());
                Node o1=new Node(temp.getIndexAdj(m).getIndexAdj(2).getNString());
                Node o2=new Node(temp.getIndexAdj(m).getIndexAdj(3).getNString());
                Root.setChild(o,o1,o2);
                number=number+3;
                
                
            }
           PrintTree(root);
            
            Root.setHead(1);
          if(pr[0]=='1')
           {
              while(Root.getVisit()!=0)
                  Root=Root.getLeft();
             }
          else  if(pr[0]=='2')
          {
             while(Root.getVisit()!=0)
                  Root=Root.getRight();
           }
           else goRandom(Root,link);  
    
            }
           
       }
        public int StringToInt(String str)
        {
          char[] c;
          c=str.toCharArray();
          if(c[0]=='1')  return 1;
          if(c[0]=='2')  return 2;
          if(c[0]=='3')  return 3;
          if(c[0]=='4')  return 4;
          else return -1;
        }
        public String PrintTree(Node Root)
        {
            Node node;
            node=Root;
            String string;
            String string1,string2,string3;
            string1=" ";
            string2=" ";
            string3=" ";
            if(node.getVisit()==0)
            {
                string=node.getString();
                System.out.print(node.getString());
            }
            if(node.getLeft()!=null) string1=PrintTree(node.getLeft());
            if(node.getMid()!=null) string2=PrintTree(node.getMid());
            if(node.getRight()!=null) string3=PrintTree(node.getRight());
            string1=string1.concat(string2);
            string=string1.concat(string3);
            return string;
        }
        public Node getRoot()
          {
             return root; 
            }
    }









⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -