1 /* 2 * Created by SharpDevelop. 3 * User: lextm 4 * Date: 2008/5/18 5 * Time: 13:24 6 * 7 * To change this template use Tools | Options | Coding | Edit Standard Headers. 8 */ 9 using System; 10 using System.Collections.Generic; 11 12 namespace Lextm.SharpSnmpLib.Mib.Elements.Types 13 { 14 /* Please be aware of the following possible constructs: 15 * 16 * isnsRegEntityIndex OBJECT-TYPE 17 * SYNTAX IsnsEntityIndexIdOrZero 18 * ( 1 .. 4294967295 ) 19 * MAX-ACCESS not-accessible 20 * 21 * 22 */ 23 24 /// <summary/> 25 /// </summary> 26 public sealed class TypeAssignment : ITypeAssignment 27 { 28 private IModule _module; 29 private string _name; 30 private string _type; 31 private ValueRanges _ranges; 32 private ValueMap _map; 33 34 /// <summary> 35 /// Creates an <see cref="TypeAssignment" />. 36 /// </summary> 37 /// <param name="module">The module.</param> 38 /// <param name="name">The name.</param> 39 /// <param name="type">The type.</param> 40 /// <param name="symbols">The symbols.</param> 41 /// <param name="isMacroSyntax">if set to <c>true</c> indicates that the syntax clause of a macro is parsed (e.g. OBJECT-TYPE, TEXTUAL-CONVENTION).</param> TypeAssignment(IModule module, string name, Symbol type, ISymbolEnumerator symbols, bool isMacroSyntax)42 public TypeAssignment(IModule module, string name, Symbol type, ISymbolEnumerator symbols, bool isMacroSyntax) 43 { 44 _module = module; 45 _name = name; 46 47 SymbolList typeSymbols = new SymbolList(); 48 typeSymbols.Add(type); 49 50 Symbol current = symbols.NextSymbol(); 51 while (current != Symbol.EOL) 52 { 53 if (current == Symbol.OpenParentheses) 54 { 55 // parse range of unknown type 56 symbols.PutBack(current); 57 _ranges = Lexer.DecodeRanges(symbols); 58 break; 59 } 60 else if (current == Symbol.OpenBracket) 61 { 62 symbols.PutBack(current); 63 _map = Lexer.DecodeEnumerations(symbols); 64 break; 65 } 66 67 typeSymbols.Add(current); 68 current = symbols.NextSymbol(); 69 } 70 71 _type = typeSymbols.Join(" "); 72 73 if ((_ranges == null) && (_map == null)) 74 { 75 current = symbols.NextNonEOLSymbol(); 76 if (current == Symbol.OpenParentheses) 77 { 78 // parse range of unknown type 79 symbols.PutBack(current); 80 _ranges = Lexer.DecodeRanges(symbols); 81 } 82 else if (current == Symbol.OpenBracket) 83 { 84 symbols.PutBack(current); 85 _map = Lexer.DecodeEnumerations(symbols); 86 } 87 else if (current != null) 88 { 89 symbols.PutBack(current); 90 } 91 } 92 93 if (isMacroSyntax) 94 { 95 // inside a macro the syntax is limited to one line, except there are brackets used for ranges/enums 96 return; 97 } 98 99 // outside macro Syntax clause we wait for two consecutive linebreaks with a following valid identifier as end condition 100 Symbol previous = current; 101 Symbol veryPrevious = null; 102 103 while ((current = symbols.NextSymbol()) != null) 104 { 105 if ((veryPrevious == Symbol.EOL) && (previous == Symbol.EOL) && current.IsValidIdentifier()) 106 { 107 symbols.PutBack(current); 108 return; 109 } 110 111 veryPrevious = previous; 112 previous = current; 113 } 114 115 previous.Assert(false, "end of file reached"); 116 } 117 118 public string Type 119 { 120 get { return _type; } 121 } 122 123 public ValueRanges Ranges 124 { 125 get { return _ranges; } 126 } 127 128 public IDictionary<long, string> Map 129 { 130 get { return _map; } 131 } 132 133 #region ITypeAssignment Member 134 135 public IModule Module 136 { 137 get { return _module; } 138 } 139 140 public string Name 141 { 142 get { return _name; } 143 } 144 145 #endregion 146 } 147 }