2 // Author: Sergey Chaban (serge@wildwestsoftware.com)
\r
7 namespace Mono.ILASM {
\r
9 public class ILToken : ICloneable {
\r
11 internal object val;
\r
13 public static readonly ILToken Invalid;
\r
14 public static readonly ILToken EOF;
\r
16 public static readonly ILToken Dot;
\r
18 public static readonly ILToken OpenBrace;
\r
19 public static readonly ILToken CloseBrace;
\r
20 public static readonly ILToken OpenBracket;
\r
21 public static readonly ILToken CloseBracket;
\r
22 public static readonly ILToken OpenParens;
\r
23 public static readonly ILToken CloseParens;
\r
24 public static readonly ILToken Comma;
\r
25 public static readonly ILToken Colon;
\r
26 public static readonly ILToken DoubleColon;
\r
27 public static readonly ILToken Semicolon;
\r
28 public static readonly ILToken Assign;
\r
29 public static readonly ILToken Star;
\r
30 public static readonly ILToken Ampersand;
\r
31 public static readonly ILToken Plus;
\r
32 public static readonly ILToken Slash;
\r
33 public static readonly ILToken Bang;
\r
34 public static readonly ILToken Ellipsis;
\r
35 public static readonly ILToken Dash;
\r
36 public static readonly ILToken OpenAngleBracket;
\r
37 public static readonly ILToken CloseAngleBracket;
\r
39 private static readonly ILToken [] punctuations;
\r
45 Invalid = new ILToken (-1, "invalid");
\r
46 EOF = new ILToken (Token.EOF, "eof");
\r
48 Dot = new ILToken (Token.DOT, ".");
\r
49 OpenBrace = new ILToken (Token.OPEN_BRACE, "{");
\r
50 CloseBrace = new ILToken (Token.CLOSE_BRACE, "}");
\r
51 OpenBracket = new ILToken (Token.OPEN_BRACKET, "[");
\r
52 CloseBracket = new ILToken (Token.CLOSE_BRACKET, "]");
\r
53 OpenParens = new ILToken (Token.OPEN_PARENS, "(");
\r
54 CloseParens = new ILToken (Token.CLOSE_PARENS, ")");
\r
55 Comma = new ILToken (Token.COMMA, ",");
\r
56 Colon = new ILToken (Token.COLON, ":");
\r
57 DoubleColon = new ILToken (Token.DOUBLE_COLON, "::");
\r
58 Semicolon = new ILToken (Token.SEMICOLON, ";");
\r
59 Assign = new ILToken (Token.ASSIGN, "=");
\r
60 Star = new ILToken (Token.STAR, "*");
\r
61 Ampersand = new ILToken (Token.AMPERSAND, "&");
\r
62 Plus = new ILToken (Token.PLUS, "+");
\r
63 Slash = new ILToken (Token.SLASH, "/");
\r
64 Bang = new ILToken (Token.BANG, "!");
\r
65 Ellipsis = new ILToken (Token.ELLIPSIS, "...");
\r
66 Dash = new ILToken (Token.DASH, "-");
\r
67 OpenAngleBracket = new ILToken (Token.OPEN_ANGLE_BRACKET, "<");
\r
68 CloseAngleBracket = new ILToken (Token.CLOSE_ANGLE_BRACKET, ">");
\r
70 punctuations = new ILToken [] {
\r
71 OpenBrace, CloseBrace,
\r
72 OpenBracket, CloseBracket,
\r
73 OpenParens, CloseParens,
\r
74 Comma, Colon, Semicolon,
\r
75 Assign, Star, Ampersand,
\r
77 OpenAngleBracket, CloseAngleBracket
\r
89 /// <param name="token"></param>
\r
90 /// <param name="val"></param>
\r
91 public ILToken (int token, object val)
\r
100 /// <param name="that"></param>
\r
101 public ILToken (ILToken that)
\r
103 this.token = that.token;
\r
104 this.val = that.val;
\r
111 public int TokenId {
\r
119 public object Value {
\r
128 /// <param name="that"></param>
\r
129 public virtual void CopyFrom (ILToken that)
\r
131 this.token = that.token;
\r
132 this.val = that.val;
\r
138 /// <returns></returns>
\r
139 public virtual object Clone ()
\r
141 return new ILToken (this);
\r
147 /// <returns></returns>
\r
148 public override int GetHashCode ()
\r
151 if (val != null) h ^= val.GetHashCode ();
\r
158 /// <returns></returns>
\r
159 public override string ToString ()
\r
161 return (token.ToString() + " : " + (val != null ? val.ToString () : "<null>"));
\r
167 /// <param name="o"></param>
\r
168 /// <returns></returns>
\r
169 public override bool Equals (object o)
\r
171 bool res = (o != null);
\r
174 res = Object.ReferenceEquals (this, o);
\r
176 res = o is ILToken;
\r
178 ILToken that = o as ILToken;
\r
179 res = (this.token == that.token) && (this.val.Equals (that.val));
\r
188 private static bool EqImpl (ILToken t1, ILToken t2)
\r
191 if ((t1 as object) != null) {
\r
192 res = t1.Equals (t2);
\r
194 res = ((t2 as object) == null);
\r
203 /// <param name="t1"></param>
\r
204 /// <param name="t2"></param>
\r
205 /// <returns></returns>
\r
206 public static bool operator == (ILToken t1, ILToken t2)
\r
208 return EqImpl (t1, t2);
\r
213 /// <param name="t1"></param>
\r
214 /// <param name="t2"></param>
\r
215 /// <returns></returns>
\r
216 public static bool operator != (ILToken t1, ILToken t2)
\r
218 return !EqImpl (t1, t2);
\r
225 /// <param name="ch"></param>
\r
226 /// <returns></returns>
\r
227 public static ILToken GetPunctuation (int ch)
\r
229 int id = "{}[](),:;=*&+/!<>".IndexOf ((char) ch);
\r
230 ILToken res = null;
\r
233 res = punctuations [id];
\r