]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.scl.compiler.parser.regexp;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5
6 import org.simantics.scl.compiler.parser.regexp.automata.NFA;
7
8 public class RSeq extends Regexp {
9     public final Regexp[] exps;
10
11     RSeq(Regexp[] exps) {
12         this.exps = exps;
13     }
14
15     @Override
16     protected void buildAutomaton(NFA aut, int inState, int outState) {
17         if(exps.length == 0) {
18             aut.addEpsilonTransition(inState, outState);
19             return;
20         }
21         for(int i=exps.length-1;i>0;--i) {
22             int midState = aut.newState();
23             exps[i].buildAutomaton(aut, midState, outState);
24             outState = midState;
25         }
26         exps[0].buildAutomaton(aut, inState, outState);
27     }
28     
29     @Override
30     protected void toString(StringBuilder b, int prec) {
31         if(prec >= 2)
32             b.append('(');
33         for(Regexp exp : exps)
34             exp.toString(b, 2);
35         if(prec >= 2)
36             b.append(')');
37     }
38     
39     @Override
40     public void toString(StringBuilder b, Namer grammar, int prec) {
41         if(prec >= 2)
42             b.append('(');
43         boolean first = true;
44         for(Regexp exp : exps) {
45             if(first)
46                 first = false;
47             else
48                 b.append(' ');
49             exp.toString(b, grammar, 2);
50         }
51         if(prec >= 2)
52             b.append(')');
53     }
54     
55     @Override
56     protected int getTypeId() {
57         return SEQ;
58     }
59     
60     @Override
61     public boolean equals(Object obj) {
62         if(obj == this)
63             return true;
64         if(obj == null || obj.getClass() != getClass())
65             return false;
66         RSeq other = (RSeq)obj;
67         return Arrays.equals(exps, other.exps);
68     }
69     
70     @Override
71     public int hashCode() {
72         int r = 31340123;
73         for(Regexp exp : exps) {
74             r *= 31;
75             r += exp.hashCode();
76         }
77         return r;
78     }
79
80     @Override
81     public Regexp simplify() {
82         if(exps.length == 0)
83             return this;
84         ArrayList<Regexp> l = new ArrayList<Regexp>(exps.length);
85         for(Regexp exp : this.exps) {
86             exp = exp.simplify();
87             seq(l, exp);
88         }
89         return seq_(l);
90     }
91     
92     @Override
93     public boolean isNullable() {
94         for(Regexp exp : exps)
95             if(!exp.isNullable())
96                 return false;
97         return true;
98     }
99 }