]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/parser/regexp/RSeq.java
Moved SCL parser generator to platform repository.
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / parser / regexp / RSeq.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/parser/regexp/RSeq.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/parser/regexp/RSeq.java
new file mode 100644 (file)
index 0000000..354ee5b
--- /dev/null
@@ -0,0 +1,99 @@
+package org.simantics.scl.compiler.parser.regexp;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.simantics.scl.compiler.parser.regexp.automata.NFA;
+
+public class RSeq extends Regexp {
+    public final Regexp[] exps;
+
+    RSeq(Regexp[] exps) {
+        this.exps = exps;
+    }
+
+    @Override
+    protected void buildAutomaton(NFA aut, int inState, int outState) {
+        if(exps.length == 0) {
+            aut.addEpsilonTransition(inState, outState);
+            return;
+        }
+        for(int i=exps.length-1;i>0;--i) {
+            int midState = aut.newState();
+            exps[i].buildAutomaton(aut, midState, outState);
+            outState = midState;
+        }
+        exps[0].buildAutomaton(aut, inState, outState);
+    }
+    
+    @Override
+    protected void toString(StringBuilder b, int prec) {
+        if(prec >= 2)
+            b.append('(');
+        for(Regexp exp : exps)
+            exp.toString(b, 2);
+        if(prec >= 2)
+            b.append(')');
+    }
+    
+    @Override
+    public void toString(StringBuilder b, Namer grammar, int prec) {
+        if(prec >= 2)
+            b.append('(');
+        boolean first = true;
+        for(Regexp exp : exps) {
+            if(first)
+                first = false;
+            else
+                b.append(' ');
+            exp.toString(b, grammar, 2);
+        }
+        if(prec >= 2)
+            b.append(')');
+    }
+    
+    @Override
+    protected int getTypeId() {
+        return SEQ;
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if(obj == this)
+            return true;
+        if(obj == null || obj.getClass() != getClass())
+            return false;
+        RSeq other = (RSeq)obj;
+        return Arrays.equals(exps, other.exps);
+    }
+    
+    @Override
+    public int hashCode() {
+        int r = 31340123;
+        for(Regexp exp : exps) {
+            r *= 31;
+            r += exp.hashCode();
+        }
+        return r;
+    }
+
+    @Override
+    public Regexp simplify() {
+        if(exps.length == 0)
+            return this;
+        ArrayList<Regexp> l = new ArrayList<Regexp>(exps.length);
+        for(Regexp exp : this.exps) {
+            exp = exp.simplify();
+            seq(l, exp);
+        }
+        return seq_(l);
+    }
+    
+    @Override
+    public boolean isNullable() {
+        for(Regexp exp : exps)
+            if(!exp.isNullable())
+                return false;
+        return true;
+    }
+}