Changeset 9078 for branches/RuntimeOptimizer/HeuristicLab.Persistence
- Timestamp:
- 12/19/12 11:16:51 (12 years ago)
- Location:
- branches/RuntimeOptimizer
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/RuntimeOptimizer
- Property svn:mergeinfo changed
/trunk/sources merged: 8972-8974,8976,8978-8994,8999-9019,9021-9031,9033-9039,9043,9049,9052,9055-9057,9063,9068,9072,9075-9076
- Property svn:mergeinfo changed
-
branches/RuntimeOptimizer/HeuristicLab.Persistence
- Property svn:mergeinfo changed
/trunk/sources/HeuristicLab.Persistence (added) merged: 9005,9014-9015,9018
- Property svn:mergeinfo changed
-
branches/RuntimeOptimizer/HeuristicLab.Persistence/3.3/Auxiliary/TypeLoader.cs
r8699 r9078 29 29 internal class TypeLoader { 30 30 #region Mono Compatibility 31 private static TypeName cachedRuntimeType; 32 private static TypeName cachedObjectEqualityComparerType; 31 private static TypeName cachedMonoRuntimeType; 32 private static TypeName cachedWindowsRuntimeType; 33 private static TypeName cachedMonoObjectEqualityComparerType; 34 private static TypeName cachedWindowsObjectEqualityComparerType; 35 36 private static bool MonoInstalled { 37 get { return Type.GetType("Mono.Runtime") != null; } 38 } 33 39 34 40 static TypeLoader() { 35 41 // we use Int32 here because we get all the information about Mono's mscorlib and just have to change the class name 36 cachedRuntimeType = TypeNameParser.Parse(typeof(System.Int32).AssemblyQualifiedName); 37 cachedRuntimeType = new TypeName(cachedRuntimeType, "MonoType"); 42 cachedMonoRuntimeType = TypeNameParser.Parse(typeof(System.Int32).AssemblyQualifiedName); 43 cachedMonoRuntimeType = new TypeName(cachedMonoRuntimeType, "MonoType"); 44 45 cachedWindowsRuntimeType = TypeNameParser.Parse(typeof(System.Int32).AssemblyQualifiedName); 46 cachedWindowsRuntimeType = new TypeName(cachedWindowsRuntimeType, "RuntimeType"); 38 47 39 48 // we need the information about the Persistence assembly, so we use TypeName here because it is contained in this assembly 40 cachedObjectEqualityComparerType = TypeNameParser.Parse(typeof(TypeName).AssemblyQualifiedName); 41 cachedObjectEqualityComparerType = new TypeName(cachedObjectEqualityComparerType, "ObjectEqualityComparer", "HeuristicLab.Persistence.Mono"); 49 cachedMonoObjectEqualityComparerType = TypeNameParser.Parse(typeof(TypeName).AssemblyQualifiedName); 50 cachedMonoObjectEqualityComparerType = new TypeName(cachedMonoObjectEqualityComparerType, "ObjectEqualityComparer", "HeuristicLab.Persistence.Mono"); 51 52 cachedWindowsObjectEqualityComparerType = TypeNameParser.Parse(typeof(System.Int32).AssemblyQualifiedName); 53 cachedWindowsObjectEqualityComparerType = new TypeName(cachedWindowsObjectEqualityComparerType, "ObjectEqualityComparer", "System.Collections.Generic"); 42 54 } 43 55 #endregion … … 60 72 catch (PersistenceException) { 61 73 #region Mono Compatibility 62 // if that fails, try to load Mono type 63 TypeName monoTypeName = GetMonoType(typeName); 64 Logger.Info(String.Format(@"Trying to load Mono type ""{0}"" instead of type ""{1}""", 65 monoTypeName, typeNameString)); 66 return LoadInternal(monoTypeName); 74 // if that fails, try to convert to the corresponding Mono or .NET type 75 if (MonoInstalled) { 76 typeName = GetMonoType(typeName); 77 Logger.Info(String.Format(@"Trying to load Mono type ""{0}"" instead of .NET type ""{1}""", 78 typeName, typeNameString)); 79 } else { 80 typeName = GetDotNetType(typeName); 81 Logger.Info(String.Format(@"Trying to load .NET type ""{0}"" instead of Mono type ""{1}""", 82 typeName, typeNameString)); 83 84 } 85 return LoadInternal(typeName); 86 #endregion 67 87 } 68 #endregion69 88 } 70 89 … … 134 153 // map System.RuntimeType to System.MonoType 135 154 if (typeName.Namespace == "System" && typeName.ClassName == "RuntimeType") { 136 return cached RuntimeType;155 return cachedMonoRuntimeType; 137 156 // map System.Collections.Generic.ObjectEqualityComparer to HeuristicLab.Mono.ObjectEqualityComparer 138 157 } else if (typeName.Namespace == "System.Collections.Generic" && typeName.ClassName == "ObjectEqualityComparer") { 139 TypeName newTypeName = new TypeName(cachedObjectEqualityComparerType); 158 TypeName newTypeName = new TypeName(cachedMonoObjectEqualityComparerType); 159 newTypeName.GenericArgs = new List<TypeName>(typeName.GenericArgs); 160 return newTypeName; 161 } 162 return typeName; 163 } 164 165 /// <summary> 166 /// Returns the corresponding type for the .NET runtime 167 /// </summary> 168 /// <returns> 169 /// The remapped typeName, or the original typeName if no mapping was found 170 /// </returns> 171 private static TypeName GetDotNetType(TypeName typeName) { 172 // map System.MonoType to System.RuntimeType 173 if (typeName.Namespace == "System" && typeName.ClassName == "MonoType") { 174 return cachedWindowsRuntimeType; 175 // maps Mono's string comparer to System.Collections.Generic.ObjectEqualityComparer<string> 176 } else if (typeName.Namespace == "System.Collections.Generic" && typeName.ClassName == "InternalStringComparer") { 177 TypeName newTypeName = new TypeName(cachedWindowsObjectEqualityComparerType); 178 var genericArgsList = new List<TypeName>(); 179 genericArgsList.Add(new TypeName(typeof(String).Namespace, "String")); 180 newTypeName.GenericArgs = genericArgsList; 181 return newTypeName; 182 } else if (typeName.Namespace == "System.Collections.Generic" && typeName.ClassName == "EqualityComparer+DefaultComparer") { 183 TypeName newTypeName = new TypeName(cachedWindowsObjectEqualityComparerType); 140 184 newTypeName.GenericArgs = new List<TypeName>(typeName.GenericArgs); 141 185 return newTypeName; -
branches/RuntimeOptimizer/HeuristicLab.Persistence/3.3/Auxiliary/TypeName.cs
r8698 r9078 51 51 52 52 /// <summary> 53 /// Gets or sets the number of generic args for 54 /// each class in a series of nested classes. 55 /// </summary> 56 [Storable] 57 public List<int> GenericArgCounts { get; private set; } 58 59 /// <summary> 53 60 /// Gets or sets the generic args. 54 61 /// </summary> … … 103 110 /// <param name="nameSpace">The namespace.</param> 104 111 /// <param name="className">Name of the class.</param> 105 internal TypeName(string nameSpace, string className ) {112 internal TypeName(string nameSpace, string className, List<int> genericArgCounts=null) { 106 113 Namespace = nameSpace; 107 114 ClassName = className; … … 109 116 MemoryMagic = ""; 110 117 AssemblyAttribues = new Dictionary<string, string>(); 118 if (genericArgCounts != null) 119 GenericArgCounts = genericArgCounts.ToList(); 111 120 } 112 121 113 122 internal TypeName(TypeName typeName, string className = null, string nameSpace = null) { 114 Namespace = typeName.Namespace;115 ClassName = typeName.ClassName;123 Namespace = nameSpace ?? typeName.Namespace; 124 ClassName = className ?? typeName.ClassName; 116 125 GenericArgs = new List<TypeName>(typeName.GenericArgs); 117 126 AssemblyAttribues = new Dictionary<string, string>(typeName.AssemblyAttribues); … … 119 128 AssemblyName = typeName.AssemblyName; 120 129 IsReference = typeName.IsReference; 121 if (nameSpace != null) 122 Namespace = nameSpace; 123 if (className != null) 124 ClassName = className; 130 if (typeName.GenericArgCounts != null) 131 GenericArgCounts = typeName.GenericArgCounts.ToList(); 125 132 } 126 133 … … 148 155 /// </returns> 149 156 public string ToString(bool full, bool includeAssembly) { 150 StringBuilder sb = new StringBuilder();157 var sb = new StringBuilder(); 151 158 if (!string.IsNullOrEmpty(Namespace)) 152 159 sb.Append(Namespace).Append('.'); 153 sb.Append(ClassName); 160 if (GenericArgCounts != null) { 161 sb.Append(string.Join("+", 162 ClassName 163 .Split('+') 164 .Zip(GenericArgCounts, (n, c) => 165 c > 0 ? String.Format("{0}`{1}", n, c) : n))); 166 } else { 167 sb.Append(ClassName); 168 if (IsGeneric) 169 sb.Append('`').Append(GenericArgs.Count); 170 } 154 171 if (IsGeneric) { 155 sb.Append('`').Append(GenericArgs.Count).Append('['); 156 bool first = true; 157 foreach (TypeName t in GenericArgs) { 158 if (first) 159 first = false; 160 else 161 sb.Append(','); 162 sb.Append('[').Append(t.ToString(full)).Append(']'); 163 } 172 sb.Append('['); 173 sb.Append(String.Join(",", GenericArgs.Select(a => 174 string.Format("[{0}]", a.ToString(full))))); 164 175 sb.Append(']'); 165 176 } … … 174 185 } 175 186 176 public string GetTypeNameInCode(HashSet<string> omitNamespaces) { 177 StringBuilder sb = new StringBuilder(); 178 if (!string.IsNullOrEmpty(Namespace) && omitNamespaces == null || !omitNamespaces.Contains(Namespace)) 179 sb.Append(Namespace).Append('.'); 180 sb.Append(ClassName); 181 if (IsGeneric) { 182 sb.Append("<"); 183 sb.Append( 184 string.Join(", ", 185 GenericArgs 186 .Select(a => a.GetTypeNameInCode(omitNamespaces)) 187 .ToArray())); 188 sb.Append(">"); 187 private IEnumerable<string> GetNestedClassesInCode(HashSet<string> omitNamespaces, bool includeAllNamespaces) { 188 var i = 0; 189 foreach (var pair in ClassName.Split('+').Zip(GenericArgCounts, (n, c) => new {n, c})) { 190 if (pair.c == 0) { 191 yield return pair.n; 192 } 193 else { 194 yield return string.Format("{0}<{1}>", 195 pair.n, 196 string.Join(",", 197 GenericArgs 198 .GetRange(i, pair.c) 199 .Select(a => a.GetTypeNameInCode(omitNamespaces, includeAllNamespaces)))); 200 i += pair.c; 201 } 202 } 203 } 204 205 private string GetTypeNameInCode(HashSet<string> omitNamespaces, bool includeNamespaces) { 206 var sb = new StringBuilder(); 207 if (!string.IsNullOrEmpty(Namespace) && 208 (omitNamespaces == null && includeNamespaces) || 209 omitNamespaces != null && !omitNamespaces.Contains(Namespace)) 210 sb.Append(Namespace).Append('.'); 211 if (GenericArgCounts != null) { 212 sb.Append(string.Join(".", GetNestedClassesInCode(omitNamespaces, includeNamespaces))); 213 } else { 214 sb.Append(ClassName); 215 if (IsGeneric) { 216 sb.Append("<"); 217 sb.Append( 218 string.Join(", ", 219 GenericArgs 220 .Select(a => a.GetTypeNameInCode(omitNamespaces, includeNamespaces)) 221 .ToArray())); 222 sb.Append(">"); 223 } 189 224 } 190 225 sb.Append(MemoryMagic); … … 192 227 } 193 228 194 public string GetTypeNameInCode(bool includeAllNamespaces) { 195 StringBuilder sb = new StringBuilder(); 196 if (includeAllNamespaces) 197 sb.Append(Namespace).Append('.'); 198 sb.Append(ClassName); 199 if (IsGeneric) { 200 sb.Append("<"); 201 sb.Append( 202 string.Join(", ", 203 GenericArgs 204 .Select(a => a.GetTypeNameInCode(includeAllNamespaces)) 205 .ToArray())); 206 sb.Append(">"); 207 } 208 sb.Append(MemoryMagic); 209 return sb.ToString(); 229 public string GetTypeNameInCode(HashSet<string> omitNamespaces) { 230 return GetTypeNameInCode(omitNamespaces, false); 231 } 232 233 public string GetTypeNameInCode(bool includeNamespaces) { 234 return GetTypeNameInCode(null, includeNamespaces); 210 235 } 211 236 -
branches/RuntimeOptimizer/HeuristicLab.Persistence/3.3/Auxiliary/TypeNameParser.cs
r7259 r9078 22 22 using System; 23 23 using System.Collections.Generic; 24 using System.Linq; 24 25 using System.Text; 25 26 using System.Text.RegularExpressions; … … 46 47 /// 47 48 /// SimpleTypeSpec := (IDENTIFIER '.')* 48 /// (IDENTIFIER ' +')*49 /// (IDENTIFIER '`\d+'? '+')* 49 50 /// IDENTIFIER 50 51 /// ( '`\d+[' Generics ']' )? … … 69 70 70 71 SimpleTypeSpec := (IDENTIFIER '.')* 71 (IDENTIFIER ' +')*72 IDENTIFIER73 ( ' `\d+[' Generics ']' )?72 (IDENTIFIER '`\d+'? 73 ( '+' IDENTIFIER '`\d+'? )* 74 ( '[' Generics ']' )? 74 75 (\*|\[(\d+\.\.\d+|\d+\.\.\.|(|\*)(,(|\*))*)\])* 75 76 (',\s*' IDENTIFIER (',\s*' AssemblyProperty)* )? 76 77 77 Generics := '[' SimpleTypeSpec ']' (',[' SimpleTypeSpec ']') 78 Generics := '[' SimpleTypeSpec ']' (',[' SimpleTypeSpec ']')* 78 79 79 80 AssemblyProperty := 'Version=' Version … … 88 89 89 90 private class Token { 90 private static Dictionary<string, string> tokens = 91 new Dictionary<string, string> { 92 {"-", "DASH"}, 93 {"&", "AMPERSAND"}, 94 {".", "DOT"}, 95 {"+", "PLUS"}, 96 {",", "COMMA"}, 97 {"[", "OPEN_BRACKET"}, 98 {"]", "CLOSE_BRACKET"}, 99 {"*", "ASTERISK"}, 100 {" ", "SPACE"}, 101 {"=", "EQUALS"}, 102 {"`", "BACKTICK"} }; 103 private static Regex NumberRegex = new Regex("^\\d+$"); 104 private static Regex IdentifierRegex = new Regex("^[_a-zA-Z][_a-zA-Z0-9]*$"); 105 private static Regex TokenRegex = new Regex("[-&.+,\\[\\]* =`]|[a-f0-9]+|\\d+|[_a-zA-Z][_a-zA-Z0-9]*"); 106 public string Name { get; private set; } 91 public enum Symbol { None, Dash, Ampersand, Dot, Plus, Comma, OpenBracket, CloseBracket, Asterisk, Space, Equals, Backtick } 92 private static readonly Dictionary<string, Symbol> TOKENS = 93 new Dictionary<string, Symbol> { 94 {"-", Symbol.Dash}, 95 {"&", Symbol.Ampersand}, 96 {".", Symbol.Dot}, 97 {"+", Symbol.Plus}, 98 {",", Symbol.Comma}, 99 {"[", Symbol.OpenBracket}, 100 {"]", Symbol.CloseBracket}, 101 {"*", Symbol.Asterisk}, 102 {" ", Symbol.Space}, 103 {"=", Symbol.Equals}, 104 {"`", Symbol.Backtick}}; 105 private static readonly Regex NumberRegex = new Regex("^\\d+$"); 106 private static readonly Regex IdentifierRegex = new Regex("^[_a-zA-Z][_a-zA-Z0-9]*$"); 107 private static readonly Regex TokenRegex = new Regex("[-&.+,\\[\\]* =`]|[a-f0-9]+|\\d+|[_a-zA-Z][_a-zA-Z0-9]*"); 108 public Symbol Name { get; private set; } 107 109 public string Value { get; private set; } 108 110 public bool IsIdentifier { get; private set; } … … 111 113 private Token(string value, int pos) { 112 114 Position = pos; 113 if (tokens.ContainsKey(value)) { 114 Name = tokens[value]; 115 Name = Symbol.None; 116 if (TOKENS.ContainsKey(value)) { 117 Name = TOKENS[value]; 115 118 } else if (NumberRegex.IsMatch(value)) { 116 119 Number = int.Parse(value); … … 128 131 } 129 132 public override string ToString() { 130 if (Name != null)133 if (Name != Symbol.None) 131 134 return "Token(" + Name + ")"; 132 135 if (Value != null) … … 154 157 /// <summary> 155 158 /// Parses the specified typename string as obtained by 156 /// <c>System.Object.GetType().FullName"</c>. 159 /// <c>System.Object.GetType().FullName</c> or 160 /// <c>System.Object.GetType().AssemblyQualifiedName</c>. 157 161 /// </summary> 158 162 /// <param name="s">The typename string.</param> … … 181 185 private TypeName TransformTypeSpec() { 182 186 TypeName t = TransformSimpleTypeSpec(); 183 t.IsReference = ConsumeToken( "AMPERSAND");187 t.IsReference = ConsumeToken(Token.Symbol.Ampersand); 184 188 return t; 185 189 } 186 190 187 191 private TypeName TransformSimpleTypeSpec() { 188 List<string> nameSpace = new List<string>(); 189 nameSpace.Add(ConsumeIdentifier()); 190 while (ConsumeToken("DOT")) 192 var nameSpace = new List<string> { ConsumeIdentifier() }; 193 while (ConsumeToken(Token.Symbol.Dot)) 191 194 nameSpace.Add(ConsumeIdentifier()); 192 List<string>className = new List<string>();195 var className = new List<string>(); 193 196 if (nameSpace.Count > 0) { 194 197 className.Add(nameSpace[nameSpace.Count - 1]); 195 198 nameSpace.RemoveAt(nameSpace.Count - 1); 196 199 } 197 while (ConsumeToken("PLUS")) 200 var genericArgCounts = new List<int> { 201 ConsumeToken(Token.Symbol.Backtick) ? ConsumeNumber() : 0 202 }; 203 while (ConsumeToken(Token.Symbol.Plus)) { 198 204 className.Add(ConsumeIdentifier()); 199 TypeName typeName = new TypeName( 205 genericArgCounts.Add(ConsumeToken(Token.Symbol.Backtick) ? ConsumeNumber() : 0); 206 } 207 var nGenericArgs = genericArgCounts.Sum(); 208 var typeName = new TypeName( 200 209 string.Join(".", nameSpace.ToArray()), 201 string.Join("+", className.ToArray())); 202 if (ConsumeToken("BACKTICK")) { 203 int nGenericArgs = ConsumeNumber(); 204 if (ConsumeToken("OPEN_BRACKET") && 205 CanConsumeToken("OPEN_BRACKET")) { 206 typeName.GenericArgs.AddRange(TransformGenerics()); 207 ConsumeToken("CLOSE_BRACKET", true); 208 } 209 } 210 StringBuilder pointerOrArray = new StringBuilder(); 210 string.Join("+", className.ToArray()), 211 nGenericArgs > genericArgCounts.Last() ? genericArgCounts : null); 212 if (nGenericArgs > 0 && ConsumeToken(Token.Symbol.OpenBracket, true)) { 213 typeName.GenericArgs.AddRange(TransformGenerics()); 214 ConsumeToken(Token.Symbol.CloseBracket, true); 215 } 216 var pointerOrArray = new StringBuilder(); 211 217 while (true) { 212 if (ConsumeToken( "ASTERSIK")) {218 if (ConsumeToken(Token.Symbol.Asterisk)) { 213 219 pointerOrArray.Append("*"); 214 } else if (ConsumeToken( "OPEN_BRACKET")) {220 } else if (ConsumeToken(Token.Symbol.OpenBracket)) { 215 221 pointerOrArray.Append('['); 216 222 ParseDimension(pointerOrArray); 217 while (ConsumeToken( "COMMA")) {223 while (ConsumeToken(Token.Symbol.Comma)) { 218 224 pointerOrArray.Append(","); 219 225 ParseDimension(pointerOrArray); 220 226 } 221 ConsumeToken( "CLOSE_BRACKET", true);227 ConsumeToken(Token.Symbol.CloseBracket, true); 222 228 pointerOrArray.Append(']'); 223 229 } else { … … 227 233 typeName.MemoryMagic = pointerOrArray.ToString(); 228 234 if (ConsumeComma()) { 229 StringBuilder sb = new StringBuilder();235 var sb = new StringBuilder(); 230 236 sb.Append(ConsumeIdentifier()); 231 while (CanConsumeToken( "DOT") ||232 CanConsumeToken( "DASH") ||237 while (CanConsumeToken(Token.Symbol.Dot) || 238 CanConsumeToken(Token.Symbol.Dash) || 233 239 CanConsumeNumber() || 234 240 CanConsumeIdentifier()) { 235 if (ConsumeToken( "DOT"))241 if (ConsumeToken(Token.Symbol.Dot)) 236 242 sb.Append('.'); 237 else if (ConsumeToken( "DASH"))243 else if (ConsumeToken(Token.Symbol.Dash)) 238 244 sb.Append('-'); 239 245 else if (CanConsumeNumber()) … … 253 259 254 260 private void ParseDimension(StringBuilder sb) { 255 if (ConsumeToken( "ASTERSIK")) {261 if (ConsumeToken(Token.Symbol.Asterisk)) { 256 262 sb.Append("*"); 257 263 } else if (CanConsumeNumber()) { 258 264 sb.Append(ConsumeNumber()); 259 ConsumeToken( "DOT", true);260 ConsumeToken( "DOT", true);261 if (ConsumeToken( "DOT")) {265 ConsumeToken(Token.Symbol.Dot, true); 266 ConsumeToken(Token.Symbol.Dot, true); 267 if (ConsumeToken(Token.Symbol.Dot)) { 262 268 sb.Append("..."); 263 269 } else { … … 268 274 269 275 private IEnumerable<TypeName> TransformGenerics() { 270 ConsumeToken( "OPEN_BRACKET", true);276 ConsumeToken(Token.Symbol.OpenBracket, true); 271 277 yield return TransformSimpleTypeSpec(); 272 ConsumeToken( "CLOSE_BRACKET", true);273 while (ConsumeToken( "COMMA")) {274 ConsumeToken( "OPEN_BRACKET", true);278 ConsumeToken(Token.Symbol.CloseBracket, true); 279 while (ConsumeToken(Token.Symbol.Comma)) { 280 ConsumeToken(Token.Symbol.OpenBracket, true); 275 281 yield return TransformSimpleTypeSpec(); 276 ConsumeToken( "CLOSE_BRACKET", true);282 ConsumeToken(Token.Symbol.CloseBracket, true); 277 283 } 278 284 } … … 280 286 private KeyValuePair<string, string> TransformAssemblyProperty() { 281 287 if (ConsumeIdentifier("Version")) { 282 ConsumeToken( "EQUALS", true);288 ConsumeToken(Token.Symbol.Equals, true); 283 289 return new KeyValuePair<string, string>( 284 290 "Version", … … 300 306 301 307 private KeyValuePair<string, string> ConsumeAssignment(string name) { 302 ConsumeToken( "EQUALS", true);308 ConsumeToken(Token.Symbol.Equals, true); 303 309 return new KeyValuePair<string, string>(name, ConsumeToken()); 304 310 } … … 307 313 StringBuilder version = new StringBuilder(); 308 314 version.Append(ConsumeNumber()); 309 ConsumeToken( "DOT");315 ConsumeToken(Token.Symbol.Dot); 310 316 version.Append('.').Append(ConsumeNumber()); 311 ConsumeToken( "DOT");317 ConsumeToken(Token.Symbol.Dot); 312 318 version.Append('.').Append(ConsumeNumber()); 313 ConsumeToken( "DOT");319 ConsumeToken(Token.Symbol.Dot); 314 320 version.Append('.').Append(ConsumeNumber()); 315 321 return version.ToString(); … … 368 374 369 375 private bool ConsumeComma() { 370 if (ConsumeToken( "COMMA")) {371 while (ConsumeToken( "SPACE")) ;376 if (ConsumeToken(Token.Symbol.Comma)) { 377 while (ConsumeToken(Token.Symbol.Space)) ; 372 378 return true; 373 379 } else { … … 376 382 } 377 383 378 private bool ConsumeToken( string name) {379 return ConsumeToken( name, false);380 } 381 382 private bool CanConsumeToken( string name) {383 if (tokens.Count == 0) 384 return false; 385 if (tokens.Peek().Name == name)384 private bool ConsumeToken(Token.Symbol symbol) { 385 return ConsumeToken(symbol, false); 386 } 387 388 private bool CanConsumeToken(Token.Symbol symbol) { 389 if (tokens.Count == 0) 390 return false; 391 if (tokens.Peek().Name == symbol) 386 392 return true; 387 393 return false; 388 394 } 389 395 390 private bool ConsumeToken( string name, bool force) {396 private bool ConsumeToken(Token.Symbol symbol, bool force) { 391 397 if (tokens.Count == 0) 392 398 if (force) 393 399 throw new ParseError(String.Format( 394 400 "end of input while expecting token \"{0}\"", 395 name));401 symbol)); 396 402 else 397 403 return false; 398 if (tokens.Peek().Name == name) {404 if (tokens.Peek().Name == symbol) { 399 405 tokens.Dequeue(); 400 406 return true; … … 402 408 throw new ParseError(String.Format( 403 409 "expected \"{0}\" found \"{1}\"", 404 name,410 symbol, 405 411 tokens.Peek().ToString())); 406 412 } else {
Note: See TracChangeset
for help on using the changeset viewer.