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

📄 transformview.java

📁 输入一个正则表达式
💻 JAVA
字号:
package reg402;

import java.awt.*;
import javax.swing.*;
import java.util.LinkedList;
import java.util.Iterator;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;

public class TransformView extends JPanel implements Constants {
  TransformModel transModel;
  Graph graph;

  //保存每个结点经过任意个ε转换到达的其他结点ID号
 private ArrayList[] ETable;
 //保存在每个转换字母上的两个关联结点的ID号
 private ArrayList[] transTable;
 //保存转换表的数据
 String[][] DfaTable;

  public TransformView(TransformModel transModel) {
    this.transModel = transModel;
    this.setPreferredSize(new Dimension(400, 300));
    this.setBackground(Color.orange);
  }

  public void paintComponent(Graphics g) {
    Graphics2D g2d = (Graphics2D)g;
    super.paintComponent(g2d);
    BasicStroke bs = new BasicStroke(1);
    Rectangle graphBounds = transModel.getBounds();
    Dimension size = this.getPreferredSize();
    Point location = new Point((size.width - graphBounds.width)/2,
        (size.height - graphBounds.height)/2);
    Element arrowLink;
    int x = 50 - graphBounds.x;
    int y = 50 - graphBounds.y;
    graph = transModel.getGraph();
    graph.setCurrent(0);

    //初始化数据结构
    ETable= new ArrayList[transModel.node.length];
    transTable=new ArrayList[transModel.regExp.length-1];
    for(int i=0; i< transModel.node.length; i++)
    {
        ETable[i] = new ArrayList();
    }
    int i,j,k,t=0;
    for(i=0,j=0; i<transTable.length;  i++)
    {
        if (transModel.regExp[i].compareTo("|")!=0
            && transModel.regExp[i].compareTo("*")!=0
            && transModel.regExp[i].compareTo("(")!=0
           && transModel.regExp[i].compareTo(")")!=0)
        {
            //transTable每个元素第一个值保存一个转换字母
            transTable[j]=new ArrayList();
            for(k=0; k<j; k++)
                if(((String)transTable[k].get(0)).compareTo(transModel.regExp[i])==0)
                    break;
            if(k==j)
            {
                transTable[j].add(transModel.regExp[i]);
                j++;
            }
        }
    }

    //为转换表申请空间
    DfaTable=new String[transModel.node.length+1][];
    for(i=0; i<DfaTable.length; i++)
        DfaTable[i]=new String[j+1];
    //初始化转换表的列
    DfaTable[0][0]="状态\\转换字符";
    for(i=1; i<DfaTable[0].length; i++)
        DfaTable[0][i]=(String)transTable[i-1].get(0);

    //画结点
    for( i = 0; i < transModel.node.length; i++) {


      Point curPoint = transModel.node[i].getPosition();
      Element node = new Element.Circle(new Point(curPoint.x + x, curPoint.y + y),
                                        RADIUS, bs, Color.black);
      Ellipse2D ellipse = new Ellipse2D.Double(curPoint.x + x - RADIUS,
                                               curPoint.y + y - RADIUS,
                                               2*RADIUS, 2*RADIUS);


      g2d.setPaint(Color.white);
      g2d.fill(ellipse);
      node.draw(g2d);

      //画状态号
      g2d.drawString((new Integer(i)).toString(),curPoint.x+x-3,curPoint.y+y+3);

    }
    //遍历图
    while(graph.hasNext()) {
      EdgeLink next = graph.getNext();
      if (next != null) {
          //边的两个点的位置
        Point pa = next.n1.getPosition();
        Point pb = next.n2.getPosition();
        String label = next.getLabel();
        //转换字母是ε,则添加入ETable
       if(label=="ε")
       {
           ETable[next.n1.getID()].add(next.n2.getID());
       }
       //否则添加入transTable
       else
       {
           i=0;
           while( (( (String) transTable[i].get(0) ).compareTo(label))!=0) i++;
           transTable[i].add(new Point(next.n1.getID(),next.n2.getID()));
       }
        Rectangle interPoint = intersectPoint(pa, pb);
        Point p1 = new Point(interPoint.x, interPoint.y);
        Point p2 = new Point(interPoint.width, interPoint.height);
        if((Math.abs(p2.x - p1.x) <= 4*RADIUS && p1.x < p2.x) || p1.y != p2.y) {
          //普通的线, 由两点X距离和Y距离决定
          arrowLink = new Element.ArrowLine(new Point(p1.x + x, p1.y + y),
                                            new Point(p2.x + x, p2.y + y),
                                            new BasicStroke(1), Color.black,
                                            label);
          arrowLink.draw(g2d);
        }
      }
    }
//实现将每个结点经过任意个ε能到达的结点ID号添加入每个数组元素
    for(i=0; i<ETable.length; i++){
        for(j=0; j<ETable[i].size(); j++){
            LookBack(i,((Integer)ETable[i].get(j)).intValue());
        }
    }
    Point pointa = graph.getStart().getPosition();
    Point pointb = new Point(pointa.x - 4*RADIUS, pointa.y);
    Rectangle interPoint = intersectPoint(pointa, pointb);
    Point point2 = new Point(interPoint.x, interPoint.y);
    Point point1 = new Point(interPoint.width, interPoint.height);
    arrowLink = new Element.ArrowLine(new Point(point1.x + x, point1.y + y),
                                            new Point(point2.x + x, point2.y + y),
                                            new BasicStroke(1), Color.black,
                                            "ε");
    arrowLink.draw(g2d);
    LinkedList list = transModel.getSpecialEdge();
    Iterator iter = list.iterator();
    while(iter.hasNext()) {
      SpecialEdge special = (SpecialEdge)iter.next();
      EdgeLink edge = special.getEdge();
      Point pb = edge.n1.getPosition();
      Point pa = edge.n2.getPosition();

      String label = edge.getLabel();
      Rectangle bounds = special.getBounds();
      if(pa.x < pb.x )  {     //*运算中的向前循环
        Point p2 = new Point(pa.x, pa.y - RADIUS);
        Point p1 = new Point(pb.x, pb.y - RADIUS);
        arrowLink = new Element.ArrowLine(new Point(p1.x + x, p1.y + y),
                                          new Point(p1.x + x,
            p1.y + y + bounds.y + RADIUS),
                                          new Point(p2.x + x,
            p2.y + y + bounds.y + RADIUS),
                                          new Point(p2.x + x, p2.y + y),
                                          new BasicStroke(1), Color.black,
                                          label);
      }
      else {         //隔着几个结点的线
        Point p2 = new Point(pa.x, pa.y + RADIUS);
        Point p1 = new Point(pb.x, pb.y + RADIUS);
        arrowLink = new Element.ArrowLine(new Point(p1.x + x, p1.y + y),
                                          new Point(p1.x + x,
            p1.y + y + bounds.height + bounds.y - RADIUS),
                                          new Point(p2.x + x,
            p2.y + y + bounds.height + bounds.y - RADIUS),
                                          new Point(p2.x + x, p2.y + y),
                                          new BasicStroke(1), Color.black,
                                          label);
      }

      arrowLink.draw(g2d);
    }

    //取得图的起始ID号
    int startID=graph.getStart().getID();
    String startString=Integer.toString(startID)+",";
    //查ETable表,取得起始结点的ε-闭包,保存于startString
    for(i=0; i<ETable[startID].size(); i++)
        startString+=Integer.toString((Integer)ETable[startID].get(i))+",";
//为转换表赋值
    DfaTable[1][0]=startString;
    int DfaPos=1,DfaEnd=1;
    int commar=0,curID=0,temp=0;
    String curString="",blankString="";
    //while循环功能:生成转换表
    while(DfaPos<=DfaEnd)
    {
        for(i=1; i<DfaTable[0].length ; i++){
            curString = DfaTable[DfaPos][0];
            blankString="";
            while (curString.compareTo("") != 0) {
                commar = curString.indexOf(",");
                curID = Integer.valueOf(curString.substring(0, commar));
                curString = curString.substring(commar + 1);

                for(j=1; j<transTable[i-1].size(); j++)
                    if(curID==((Point)transTable[i-1].get(j)).x){
                        blankString +=
                                Integer.toString(((Point) transTable[i -
                                                  1].get(j)).y) + ",";
                    }
            }
            String tempString=blankString;
            while(tempString.compareTo("")!=0){
                try{
                   commar = tempString.indexOf(",");
                   temp = Integer.valueOf(tempString.substring(0, commar));
                   tempString = tempString.substring(commar + 1);
                }
                catch(Exception e){
                    JOptionPane.showMessageDialog(null,"这样的表达式是没有意义的!请重新输入","402告诉你:",0);
                   System.exit(0);
                }
                String blanktemp;
                boolean flag=true;

            for(k=0; k<ETable[temp].size(); k++)
            {
                blanktemp=blankString;
                flag=true;
                while(blanktemp.compareTo("")!=0)
                {
                    commar = blanktemp.indexOf(",");
                    String ss = blanktemp.substring(0, commar);
                    blanktemp = blanktemp.substring(commar + 1);

                    if ((((Integer) ETable[temp].get(k)).toString().
                         compareTo(ss)) == 0)
                        flag=false;
                }
                        if(flag)
                        blankString += ((Integer) ETable[temp].get(k)).
                                toString() + ",";
            }
            //将找到的第一个状态集合添加入转换表相应位置
            DfaTable[DfaPos][i]=blankString;
            for( t=1; t<=DfaEnd; t++)
                if(blankString.compareTo(DfaTable[t][0])==0) break;
            }
            //将此集合添加入下一行,以方便下一次生成其他状态集合
            if(t>DfaEnd)
                DfaTable[++DfaEnd][0]=blankString;
        }
        DfaPos++;
    }

    g2d.dispose();


  }

  public Rectangle intersectPoint(Point center1, Point center2) {
    double l = Math.sqrt((center2.x - center1.x)*(center2.x - center1.x) +
                         (center2.y - center1.y)*(center2.y - center1.y));

    int x1 = (int)(RADIUS/l*(center2.x - center1.x)) + center1.x;
    int y1 = (int)(RADIUS/l*(center2.y - center1.y)) + center1.y;
    int x2 = (int)((l - RADIUS)/l*(center2.x - center1.x)) + center1.x;
    int y2 = (int)((l - RADIUS)/l*(center2.y - center1.y)) + center1.y;

    return new Rectangle(x1, y1, x2, y2);
  }
//函数功能:见上面所述
  private void LookBack(int CurPos, int newID)
  {
      for(int i=0; i<ETable.length; i++)
      {
          for(int j=0; j<ETable[i].size(); j++)
          {
              if (((Integer)(ETable[i].get(j))).intValue()==CurPos && EExit(i,newID))
              {
                  ETable[i].add(newID);
                  LookBack(i,newID);
              }
          }

      }
  }
  //函数功能:判断ETable当前行有无重复的ID号,有则不添加新的ID号
  private boolean EExit(int i,int newID){
      for(int j=0; j<ETable[i].size(); j++)
          if(((Integer)ETable[i].get(j)).intValue()==newID)
              return false;
      return true;

      }
}

⌨️ 快捷键说明

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