1 /*
2 * Zemucan: A Syntax Assistant for DB2
3 * Copyright (C) 2009, 2010 Andres Gomez Casanova
4 *
5 * This file is part of Zemucan.
6 *
7 * Zemucan is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * Zemucan is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, see <http://www.gnu.org/licenses/>.
19 *
20 * Contact:
21 * a n g o c a at y a h o o dot c o m
22 * Cra. 45 No 61 - 31, Bogota, Colombia.
23 *
24 * Author: $LastChangedBy: angoca $:
25 * Date: $LastChangedDate: 2011-03-06 09:19:05 -0500 (dom, 06 mar 2011) $:
26 * Revision: $LastChangedRevision: 1910 $:
27 * URL: $HeadURL: https://zemucan.svn.sourceforge.net/svnroot/zemucan/branches/zemucan_v1/source-code/analyzers/src/main/java/name/angoca/zemucan/core/lexical/model/Token.java $:
28 */
29 package name.angoca.zemucan.core.lexical.model;
30
31 import name.angoca.zemucan.core.lexical.impl.InvalidTokenException;
32
33 /**
34 * This is the representation of the decomposition of a phrase in several words
35 * or symbols. Each token is the product of dividing the given phrase and
36 * tokenize it in spaces, parenthesis and single and double quotation marks.
37 * <p>
38 * This object is immutable, once it is created, their properties cannot be
39 * changed. This is the reason because there are not setter methods.
40 * <p>
41 * <b>Control Version</b>
42 * <p>
43 * <ul>
44 * <li>0.0.1 Class creation.</li>
45 * <li>0.0.2 Recommendations from PMD.</li>
46 * <li>1.0.0 Moved to version 1.</li>
47 * <li>1.0.1 equals.</li>
48 * <li>1.0.2 asserts.</li>
49 * <li>1.0.3 compareTo -> equals.</li>
50 * <li>1.6.0 Method renamed.</li>
51 * <li>1.7.0 Is reserved.</li>
52 * </ul>
53 *
54 * @author Andres Gomez Casanova <a
55 * href="mailto:a n g o c a at y a h o o dot c o m" >(AngocA)</a>
56 * @version 1.7.0 2010-05-14
57 */
58 public class Token implements Cloneable {
59
60 /**
61 * Represents if the token is a reserved word or a variable name.
62 */
63 private final transient boolean reservedWord;
64 /**
65 * Content that the token represents.
66 */
67 private final transient String token;
68
69 /**
70 * Constructor of a token, giving the value of it. A token cannot be a empty
71 * string.
72 *
73 * @param tokenName
74 * Value to represent.
75 * @param isReservedWord
76 * Indicates if the token is a reserved word in the grammar.
77 * @throws InvalidTokenException
78 * When trying to create an invalid token.
79 */
80 public Token(final String/* ! */tokenName, final boolean isReservedWord)
81 throws InvalidTokenException {
82 assert tokenName != null;
83
84 if (tokenName.equals("")) { //$NON-NLS-1$
85 throw new InvalidTokenException();
86 }
87 this.token = tokenName;
88 this.reservedWord = isReservedWord;
89 }
90
91 @Override
92 public final Token/* ! */clone() throws CloneNotSupportedException {
93 return (Token) super.clone();
94 }
95
96 /*
97 * (non-Javadoc)
98 * @see java.lang.Object#equals(java.lang.Object)
99 */
100 @Override
101 public final boolean equals(final Object/* ? */object) {
102 boolean equals = false;
103 if (object instanceof Token) {
104 final Token otherToken = (Token) object;
105 if (otherToken.token.equals(this.token)) {
106 equals = true;
107 }
108 }
109 return equals;
110 }
111
112 /**
113 * Returns the value that this token represents.
114 *
115 * @return the value that this token represents.
116 */
117 public final String/* ! */getToken() {
118 assert this.token != null;
119 return this.token;
120 }
121
122 /*
123 * (non-Javadoc)
124 * @see java.lang.Object#hashCode()
125 */
126 @Override
127 public final int hashCode() {
128 final int value = this.getClass().getName().hashCode()
129 + this.token.hashCode();
130 return value;
131 }
132
133 /**
134 * Returns true if the token represents a reserved word in the grammar.
135 * False if not.
136 *
137 * @return if the token represents a reserved word
138 */
139 public final boolean isReservedWord() {
140 return this.reservedWord;
141 }
142
143 /**
144 * Returns a string representation of a token. The representation is:
145 * T[token]
146 *
147 * @see java.lang.Object#toString()
148 * @return String representation of a token.
149 */
150 @Override
151 public final String/* ! */toString() {
152 String ret = "T[" + this.token;
153 String reserved = "|R"; //$NON-NLS-1$
154 if (!this.reservedWord) {
155 reserved = ""; //$NON-NLS-1$
156 }
157 ret += reserved + ']';
158
159 return ret;
160 }
161 }