Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/16/13 13:13:41 (11 years ago)
Author:
spimming
Message:

#1888:

  • Merged revisions from trunk
Location:
branches/OaaS
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/OaaS

  • branches/OaaS/HeuristicLab.Persistence

  • branches/OaaS/HeuristicLab.Persistence/3.3/Auxiliary/TypeNameParser.cs

    r7259 r9363  
    2222using System;
    2323using System.Collections.Generic;
     24using System.Linq;
    2425using System.Text;
    2526using System.Text.RegularExpressions;
     
    4647  ///
    4748  /// SimpleTypeSpec := (IDENTIFIER '.')*
    48   ///                   (IDENTIFIER '+')*
     49  ///                   (IDENTIFIER '`\d+'? '+')*
    4950  ///                    IDENTIFIER
    5051  ///                   ( '`\d+[' Generics ']' )?
     
    6970
    7071      SimpleTypeSpec := (IDENTIFIER '.')*
    71                         (IDENTIFIER '+')*
    72                          IDENTIFIER
    73                         ( '`\d+[' Generics ']' )?
     72                        (IDENTIFIER '`\d+'?
     73                        ( '+' IDENTIFIER '`\d+'? )*
     74                        ( '[' Generics ']' )?
    7475                        (\*|\[(\d+\.\.\d+|\d+\.\.\.|(|\*)(,(|\*))*)\])*
    7576                        (',\s*' IDENTIFIER (',\s*' AssemblyProperty)* )?
    7677
    77       Generics := '[' SimpleTypeSpec ']' (',[' SimpleTypeSpec ']')
     78      Generics := '[' SimpleTypeSpec ']' (',[' SimpleTypeSpec ']')*
    7879
    7980      AssemblyProperty := 'Version=' Version
     
    8889
    8990    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; }
    107109      public string Value { get; private set; }
    108110      public bool IsIdentifier { get; private set; }
     
    111113      private Token(string value, int pos) {
    112114        Position = pos;
    113         if (tokens.ContainsKey(value)) {
    114           Name = tokens[value];
     115        Name = Symbol.None;
     116        if (TOKENS.ContainsKey(value)) {
     117          Name = TOKENS[value];
    115118        } else if (NumberRegex.IsMatch(value)) {
    116119          Number = int.Parse(value);
     
    128131      }
    129132      public override string ToString() {
    130         if (Name != null)
     133        if (Name != Symbol.None)
    131134          return "Token(" + Name + ")";
    132135        if (Value != null)
     
    154157    /// <summary>
    155158    /// 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>.
    157161    /// </summary>
    158162    /// <param name="s">The typename string.</param>
     
    181185    private TypeName TransformTypeSpec() {
    182186      TypeName t = TransformSimpleTypeSpec();
    183       t.IsReference = ConsumeToken("AMPERSAND");
     187      t.IsReference = ConsumeToken(Token.Symbol.Ampersand);
    184188      return t;
    185189    }
    186190
    187191    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))
    191194        nameSpace.Add(ConsumeIdentifier());
    192       List<string> className = new List<string>();
     195      var className = new List<string>();
    193196      if (nameSpace.Count > 0) {
    194197        className.Add(nameSpace[nameSpace.Count - 1]);
    195198        nameSpace.RemoveAt(nameSpace.Count - 1);
    196199      }
    197       while (ConsumeToken("PLUS"))
     200      var genericArgCounts = new List<int> {
     201        ConsumeToken(Token.Symbol.Backtick) ? ConsumeNumber() : 0
     202      };
     203      while (ConsumeToken(Token.Symbol.Plus)) {
    198204        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(
    200209        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();
    211217      while (true) {
    212         if (ConsumeToken("ASTERSIK")) {
     218        if (ConsumeToken(Token.Symbol.Asterisk)) {
    213219          pointerOrArray.Append("*");
    214         } else if (ConsumeToken("OPEN_BRACKET")) {
     220        } else if (ConsumeToken(Token.Symbol.OpenBracket)) {
    215221          pointerOrArray.Append('[');
    216222          ParseDimension(pointerOrArray);
    217           while (ConsumeToken("COMMA")) {
     223          while (ConsumeToken(Token.Symbol.Comma)) {
    218224            pointerOrArray.Append(",");
    219225            ParseDimension(pointerOrArray);
    220226          }
    221           ConsumeToken("CLOSE_BRACKET", true);
     227          ConsumeToken(Token.Symbol.CloseBracket, true);
    222228          pointerOrArray.Append(']');
    223229        } else {
     
    227233      typeName.MemoryMagic = pointerOrArray.ToString();
    228234      if (ConsumeComma()) {
    229         StringBuilder sb = new StringBuilder();
     235        var sb = new StringBuilder();
    230236        sb.Append(ConsumeIdentifier());
    231         while (CanConsumeToken("DOT") ||
    232           CanConsumeToken("DASH") ||
     237        while (CanConsumeToken(Token.Symbol.Dot) ||
     238          CanConsumeToken(Token.Symbol.Dash) ||
    233239          CanConsumeNumber() ||
    234240          CanConsumeIdentifier()) {
    235           if (ConsumeToken("DOT"))
     241          if (ConsumeToken(Token.Symbol.Dot))
    236242            sb.Append('.');
    237           else if (ConsumeToken("DASH"))
     243          else if (ConsumeToken(Token.Symbol.Dash))
    238244            sb.Append('-');
    239245          else if (CanConsumeNumber())
     
    253259
    254260    private void ParseDimension(StringBuilder sb) {
    255       if (ConsumeToken("ASTERSIK")) {
     261      if (ConsumeToken(Token.Symbol.Asterisk)) {
    256262        sb.Append("*");
    257263      } else if (CanConsumeNumber()) {
    258264        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)) {
    262268          sb.Append("...");
    263269        } else {
     
    268274
    269275    private IEnumerable<TypeName> TransformGenerics() {
    270       ConsumeToken("OPEN_BRACKET", true);
     276      ConsumeToken(Token.Symbol.OpenBracket, true);
    271277      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);
    275281        yield return TransformSimpleTypeSpec();
    276         ConsumeToken("CLOSE_BRACKET", true);
     282        ConsumeToken(Token.Symbol.CloseBracket, true);
    277283      }
    278284    }
     
    280286    private KeyValuePair<string, string> TransformAssemblyProperty() {
    281287      if (ConsumeIdentifier("Version")) {
    282         ConsumeToken("EQUALS", true);
     288        ConsumeToken(Token.Symbol.Equals, true);
    283289        return new KeyValuePair<string, string>(
    284290          "Version",
     
    300306
    301307    private KeyValuePair<string, string> ConsumeAssignment(string name) {
    302       ConsumeToken("EQUALS", true);
     308      ConsumeToken(Token.Symbol.Equals, true);
    303309      return new KeyValuePair<string, string>(name, ConsumeToken());
    304310    }
     
    307313      StringBuilder version = new StringBuilder();
    308314      version.Append(ConsumeNumber());
    309       ConsumeToken("DOT");
     315      ConsumeToken(Token.Symbol.Dot);
    310316      version.Append('.').Append(ConsumeNumber());
    311       ConsumeToken("DOT");
     317      ConsumeToken(Token.Symbol.Dot);
    312318      version.Append('.').Append(ConsumeNumber());
    313       ConsumeToken("DOT");
     319      ConsumeToken(Token.Symbol.Dot);
    314320      version.Append('.').Append(ConsumeNumber());
    315321      return version.ToString();
     
    368374
    369375    private bool ConsumeComma() {
    370       if (ConsumeToken("COMMA")) {
    371         while (ConsumeToken("SPACE")) ;
     376      if (ConsumeToken(Token.Symbol.Comma)) {
     377        while (ConsumeToken(Token.Symbol.Space)) ;
    372378        return true;
    373379      } else {
     
    376382    }
    377383
    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)
    386392        return true;
    387393      return false;
    388394    }
    389395
    390     private bool ConsumeToken(string name, bool force) {
     396    private bool ConsumeToken(Token.Symbol symbol, bool force) {
    391397      if (tokens.Count == 0)
    392398        if (force)
    393399          throw new ParseError(String.Format(
    394400            "end of input while expecting token \"{0}\"",
    395             name));
     401            symbol));
    396402        else
    397403          return false;
    398       if (tokens.Peek().Name == name) {
     404      if (tokens.Peek().Name == symbol) {
    399405        tokens.Dequeue();
    400406        return true;
     
    402408        throw new ParseError(String.Format(
    403409          "expected \"{0}\" found \"{1}\"",
    404           name,
     410          symbol,
    405411          tokens.Peek().ToString()));
    406412      } else {
Note: See TracChangeset for help on using the changeset viewer.