- Timestamp:
- 04/16/13 13:13:41 (11 years ago)
- Location:
- branches/OaaS
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/OaaS
- Property svn:ignore
-
old new 21 21 protoc.exe 22 22 _ReSharper.HeuristicLab 3.3 Tests 23 Google.ProtocolBuffers-2.4.1.473.dll 23 24 packages
-
- Property svn:mergeinfo changed
- Property svn:ignore
-
branches/OaaS/HeuristicLab.Persistence
- Property svn:mergeinfo changed
/trunk/sources/HeuristicLab.Persistence (added) merged: 8246,8588,8600,8641,8647,8698-8699,8924,9005,9014-9015,9018
- Property svn:mergeinfo changed
-
branches/OaaS/HeuristicLab.Persistence/3.3/Auxiliary/TypeNameParser.cs
r7259 r9363 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.