home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / esc.jar / com / extensibility / util / regexpr / Pattern.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-06-30  |  5.2 KB  |  278 lines

  1. package com.extensibility.util.regexpr;
  2.  
  3. import com.extensibility.util.Deque;
  4. import java.util.Enumeration;
  5. import java.util.Vector;
  6.  
  7. public class Pattern {
  8.    protected MatchState initialState;
  9.  
  10.    public Pattern(PatternTerm var1) {
  11.       this.initialState = this.makeStateMachine(var1);
  12.    }
  13.  
  14.    public Pattern(String var1) {
  15.       PatternTerm var2 = RegExpr.parse(var1);
  16.       this.initialState = this.makeStateMachine(var2);
  17.    }
  18.  
  19.    private MatchState makeStateMachine(PatternTerm var1) {
  20.       MatchState var2 = new MatchState((PatternTerm)null);
  21.       if (var1 != null) {
  22.          MatchState var3 = this.compile(var1, var2);
  23.          if (var3.getTerm() != null) {
  24.             MatchState var4 = new MatchState((PatternTerm)null);
  25.             var3.addNext(var4);
  26.          }
  27.       }
  28.  
  29.       return var2;
  30.    }
  31.  
  32.    private MatchState compileOne(PatternTerm var1, MatchState var2) {
  33.       MatchState var3;
  34.       if (var1.isSeq()) {
  35.          var3 = var2;
  36.  
  37.          PatternTerm var5;
  38.          for(Enumeration var4 = var1.getPatternTerms(); var4.hasMoreElements(); var3 = this.compile(var5, var3)) {
  39.             var5 = (PatternTerm)var4.nextElement();
  40.          }
  41.       } else if (var1.isChoice()) {
  42.          MatchState var8 = new MatchState((PatternTerm)null);
  43.          Enumeration var10 = var1.getPatternTerms();
  44.  
  45.          while(var10.hasMoreElements()) {
  46.             PatternTerm var6 = (PatternTerm)var10.nextElement();
  47.             var3 = this.compile(var6, var2);
  48.             var3.addNext(var8);
  49.          }
  50.  
  51.          var3 = var8;
  52.       } else {
  53.          MatchState var9 = new MatchState(var1);
  54.          var2.addNext(var9);
  55.          var3 = var9;
  56.       }
  57.  
  58.       return var3;
  59.    }
  60.  
  61.    private MatchState compile(PatternTerm var1, MatchState var2) {
  62.       int var4 = var1.getMinOccurrence();
  63.       int var5 = var1.getMaxOccurrence();
  64.  
  65.       while(var4 > 0) {
  66.          var2 = this.compileOne(var1, var2);
  67.          --var4;
  68.          if (var5 != Integer.MAX_VALUE) {
  69.             --var5;
  70.          }
  71.       }
  72.  
  73.       MatchState var9;
  74.       if (var5 == Integer.MAX_VALUE) {
  75.          MatchState var7 = new MatchState((PatternTerm)null);
  76.          MatchState var8 = new MatchState((PatternTerm)null);
  77.          var2.addNext(var7);
  78.          var9 = this.compileOne(var1, var7);
  79.          var9.addNext(var7);
  80.          var7.addNext(var8);
  81.          var9 = var8;
  82.       } else if (var5 > 0) {
  83.          MatchState var10 = new MatchState((PatternTerm)null);
  84.          var2.addNext(var10);
  85.  
  86.          while(var5 > 0) {
  87.             var2 = this.compileOne(var1, var2);
  88.             var2.addNext(var10);
  89.             --var5;
  90.          }
  91.  
  92.          var9 = var10;
  93.       } else {
  94.          var9 = var2;
  95.       }
  96.  
  97.       return var9;
  98.    }
  99.  
  100.    protected void updateFollowers(Deque var1, Vector var2) {
  101.       if (var2 != null) {
  102.          while(true) {
  103.             MatchState var3 = (MatchState)var1.removeHead();
  104.             if (var3 == null) {
  105.                break;
  106.             }
  107.  
  108.             this.addFollowers(var3, var2, new Vector());
  109.          }
  110.       }
  111.  
  112.    }
  113.  
  114.    public boolean matches(String var1) {
  115.       return this.matches(new CharPatternInput(var1), (Vector)null);
  116.    }
  117.  
  118.    public boolean matches(PatternInput var1) {
  119.       return this.matches(var1, (Vector)null);
  120.    }
  121.  
  122.    public boolean matches(PatternInput var1, Vector var2) {
  123.       Deque var3 = new Deque();
  124.       var3.addHead((Object)null);
  125.       var3.addHead(this.initialState);
  126.       Vector var4 = new Vector();
  127.  
  128.       while(var3.size() != 0) {
  129.          MatchState var5 = (MatchState)var3.removeHead();
  130.          if (var5 == null) {
  131.             if (var3.size() == 0) {
  132.                return false;
  133.             }
  134.  
  135.             if (!var1.hasNext()) {
  136.                this.updateFollowers(var3, var2);
  137.                return false;
  138.             }
  139.  
  140.             var1.next();
  141.             var3.addTail((Object)null);
  142.             var4.removeAllElements();
  143.             if (var2 != null) {
  144.                var2.removeAllElements();
  145.             }
  146.          } else if (var5.isEnd()) {
  147.             if (!var1.hasNext()) {
  148.                this.updateFollowers(var3, var2);
  149.                return true;
  150.             }
  151.          } else if (var5.getTerm() == null) {
  152.             Enumeration var8 = var5.nextStates();
  153.  
  154.             while(var8.hasMoreElements()) {
  155.                Object var7 = var8.nextElement();
  156.                if (var4.indexOf(var7) == -1) {
  157.                   var4.addElement(var7);
  158.                   var3.addHead((MatchState)var7);
  159.                }
  160.             }
  161.          } else if (var1.hasNext() && var5.getTerm().matches(var1.peekNext())) {
  162.             Enumeration var6 = var5.nextStates();
  163.  
  164.             while(var6.hasMoreElements()) {
  165.                var3.addTail((MatchState)var6.nextElement());
  166.             }
  167.          } else if (var2 != null) {
  168.             var2.addElement(var5.getTerm());
  169.          }
  170.       }
  171.  
  172.       return false;
  173.    }
  174.  
  175.    public Vector getFollowers(String var1) {
  176.       Vector var2 = new Vector();
  177.       if (var1 == null) {
  178.          this.addFollowers(this.initialState, var2, new Vector());
  179.       } else {
  180.          Vector var3 = new Vector();
  181.          this.addStatesToVector(this.initialState, var3);
  182.  
  183.          for(int var4 = 0; var4 < var3.size(); ++var4) {
  184.             MatchState var5 = (MatchState)var3.elementAt(var4);
  185.             if (var5.getTerm() != null && var5.getTerm().matches(var1)) {
  186.                Enumeration var6 = var5.nextStates();
  187.  
  188.                while(var6.hasMoreElements()) {
  189.                   this.addFollowers((MatchState)var6.nextElement(), var2, new Vector());
  190.                }
  191.             }
  192.          }
  193.       }
  194.  
  195.       return var2;
  196.    }
  197.  
  198.    protected void addFollowers(MatchState var1, Vector var2, Vector var3) {
  199.       if (var1.getTerm() == null) {
  200.          if (var3.indexOf(var1) == -1) {
  201.             var3.addElement(var1);
  202.             Enumeration var4 = var1.nextStates();
  203.  
  204.             while(var4.hasMoreElements()) {
  205.                this.addFollowers((MatchState)var4.nextElement(), var2, var3);
  206.             }
  207.          }
  208.       } else if (var2.indexOf(var1.getTerm()) == -1) {
  209.          var2.addElement(var1.getTerm());
  210.       }
  211.  
  212.    }
  213.  
  214.    public boolean isDeterministic() {
  215.       Vector var1 = new Vector();
  216.       this.addStatesToVector(this.initialState, var1);
  217.       Vector var2 = new Vector();
  218.  
  219.       for(int var3 = 0; var3 < var1.size(); ++var3) {
  220.          MatchState var4 = (MatchState)var1.elementAt(var3);
  221.          if (var4.getTerm() == null) {
  222.             Vector var5 = new Vector();
  223.             this.addFollowers(var4, var5, var2);
  224.  
  225.             for(int var6 = 0; var6 < var5.size() - 1; ++var6) {
  226.                PatternTerm var7 = (PatternTerm)var5.elementAt(var6);
  227.  
  228.                for(int var8 = var6 + 1; var8 < var5.size(); ++var8) {
  229.                   PatternTerm var9 = (PatternTerm)var5.elementAt(var8);
  230.                   if (var7.intersects(var9)) {
  231.                      return false;
  232.                   }
  233.                }
  234.             }
  235.          }
  236.       }
  237.  
  238.       return true;
  239.    }
  240.  
  241.    protected void printStateMachine(String var1) {
  242.       System.out.println(String.valueOf("Name = ").concat(String.valueOf(var1)));
  243.       Vector var2 = new Vector();
  244.       this.addStatesToVector(this.initialState, var2);
  245.  
  246.       for(int var3 = 0; var3 < var2.size(); ++var3) {
  247.          System.out.print(String.valueOf(String.valueOf("#").concat(String.valueOf(var3))).concat(String.valueOf(" ")));
  248.          MatchState var4 = (MatchState)var2.elementAt(var3);
  249.          if (var4.getTerm() != null) {
  250.             System.out.print(var4.getTerm().toString());
  251.          }
  252.  
  253.          System.out.print(" ==> ");
  254.          Enumeration var5 = var4.nextStates();
  255.  
  256.          while(var5.hasMoreElements()) {
  257.             MatchState var6 = (MatchState)var5.nextElement();
  258.             System.out.print(String.valueOf(" ").concat(String.valueOf(var2.indexOf(var6))));
  259.          }
  260.  
  261.          System.out.println();
  262.       }
  263.  
  264.    }
  265.  
  266.    protected void addStatesToVector(MatchState var1, Vector var2) {
  267.       if (var2.indexOf(var1) < 0) {
  268.          var2.addElement(var1);
  269.          Enumeration var3 = var1.nextStates();
  270.  
  271.          while(var3.hasMoreElements()) {
  272.             this.addStatesToVector((MatchState)var3.nextElement(), var2);
  273.          }
  274.  
  275.       }
  276.    }
  277. }
  278.