• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * [The "BSD license"]
3  *  Copyright (c) 2010 Terence Parr
4  *  All rights reserved.
5  *
6  *  Redistribution and use in source and binary forms, with or without
7  *  modification, are permitted provided that the following conditions
8  *  are met:
9  *  1. Redistributions of source code must retain the above copyright
10  *      notice, this list of conditions and the following disclaimer.
11  *  2. Redistributions in binary form must reproduce the above copyright
12  *      notice, this list of conditions and the following disclaimer in the
13  *      documentation and/or other materials provided with the distribution.
14  *  3. The name of the author may not be used to endorse or promote products
15  *      derived from this software without specific prior written permission.
16  *
17  *  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  *  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 package org.antlr.analysis;
29 
30 /** A generic transition between any two state machine states.  It defines
31  *  some special labels that indicate things like epsilon transitions and
32  *  that the label is actually a set of labels or a semantic predicate.
33  *  This is a one way link.  It emanates from a state (usually via a list of
34  *  transitions) and has a label/target pair.  I have abstracted the notion
35  *  of a Label to handle the various kinds of things it can be.
36  */
37 public class Transition implements Comparable<Transition> {
38     /** What label must be consumed to transition to target */
39     public Label label;
40 
41     /** The target of this transition */
42     public State target;
43 
Transition(Label label, State target)44     public Transition(Label label, State target) {
45         this.label = label;
46         this.target = target;
47     }
48 
Transition(int label, State target)49     public Transition(int label, State target) {
50         this.label = new Label(label);
51         this.target = target;
52     }
53 
isEpsilon()54 	public boolean isEpsilon() {
55 		return label.isEpsilon();
56 	}
57 
isAction()58 	public boolean isAction() {
59 		return label.isAction();
60 	}
61 
isSemanticPredicate()62     public boolean isSemanticPredicate() {
63         return label.isSemanticPredicate();
64     }
65 
66 	@Override
hashCode()67     public int hashCode() {
68         return label.hashCode() + target.stateNumber;
69     }
70 
71 	@Override
equals(Object o)72     public boolean equals(Object o) {
73         Transition other = (Transition)o;
74         return this.label.equals(other.label) &&
75                this.target.equals(other.target);
76     }
77 
78 	@Override
compareTo(Transition other)79     public int compareTo(Transition other) {
80         return this.label.compareTo(other.label);
81     }
82 
83 	@Override
toString()84     public String toString() {
85         return label+"->"+target.stateNumber;
86     }
87 }
88