| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- /*
- * Created by SharpDevelop.
- * User: lextm
- * Date: 2008/5/17
- * Time: 17:38
- *
- * To change this template use Tools | Options | Coding | Edit Standard Headers.
- */
- using System;
- using System.Collections.Generic;
- using Lextm.SharpSnmpLib.Mib.Elements;
- using Lextm.SharpSnmpLib.Mib.Elements.Entities;
- using Lextm.SharpSnmpLib.Mib.Elements.Types;
- namespace Lextm.SharpSnmpLib.Mib
- {
- /// <summary>
- /// MIB module class.
- /// </summary>
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Mib")]
- public sealed class MibModule : IModule
- {
- private readonly string _name;
- private readonly Imports _imports;
- private readonly Exports _exports;
- private readonly List<IElement> _tokens = new List<IElement>();
-
- /// <summary>
- /// Creates a <see cref="MibModule"/> with a specific <see cref="Lexer"/>.
- /// </summary>
- /// <param name="name">Module name</param>
- /// <param name="symbols">Lexer</param>
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "lexer")]
- public MibModule(ISymbolEnumerator symbols)
- {
- if (symbols == null)
- {
- throw new ArgumentNullException("lexer");
- }
- Symbol temp = symbols.NextNonEOLSymbol();
- temp.AssertIsValidIdentifier();
- _name = temp.ToString().ToUpperInvariant(); // all module names are uppercase
-
- temp = symbols.NextNonEOLSymbol();
- temp.Expect(Symbol.Definitions);
-
- temp = symbols.NextNonEOLSymbol();
- temp.Expect(Symbol.Assign);
-
- temp = symbols.NextSymbol();
- temp.Expect(Symbol.Begin);
-
- temp = symbols.NextNonEOLSymbol();
- if (temp == Symbol.Imports)
- {
- _imports = ParseDependents(symbols);
- }
- else if (temp == Symbol.Exports)
- {
- _exports = ParseExports(symbols);
- }
- else
- {
- symbols.PutBack(temp);
- }
- ParseEntities(symbols);
- }
- #region Accessors
- /// <summary>
- /// Module name.
- /// </summary>
- public string Name
- {
- get { return _name; }
- }
-
- public Exports Exports
- {
- get { return _exports; }
- }
- public Imports Imports
- {
- get { return _imports; }
- }
- public List<IElement> Tokens
- {
- get { return this._tokens; }
- }
- /// <summary>
- /// Entities + Types + all other elements implementing IDeclaration
- /// </summary>
- public IList<IDeclaration> Declarations
- {
- get
- {
- IList<IDeclaration> result = new List<IDeclaration>();
- foreach (IElement e in _tokens)
- {
- IDeclaration decl = e as IDeclaration;
- if (decl != null)
- {
- result.Add(decl);
- }
- }
- return result;
- }
- }
- /// <summary>
- /// OID nodes.
- /// </summary>
- public IList<IEntity> Entities
- {
- get
- {
- IList<IEntity> result = new List<IEntity>();
- foreach (IElement e in _tokens)
- {
- IEntity entity = e as IEntity;
- if (entity != null)
- {
- result.Add(entity);
- }
- }
- return result;
- }
- }
- public IList<ITypeAssignment> Types
- {
- get
- {
- IList<ITypeAssignment> result = new List<ITypeAssignment>();
- foreach (IElement e in _tokens)
- {
- ITypeAssignment type = e as ITypeAssignment;
- if (type != null)
- {
- result.Add(type);
- }
- }
- return result;
- }
- }
- #endregion
- #region Parsing of Symbols
- private Exports ParseExports(ISymbolEnumerator symbols)
- {
- return new Exports(this, symbols);
- }
- private Imports ParseDependents(ISymbolEnumerator symbols)
- {
- return new Imports(this, symbols);
- }
-
- private void ParseEntities(ISymbolEnumerator symbols)
- {
- Symbol temp = symbols.NextNonEOLSymbol();
- SymbolList buffer = new SymbolList();
- while (temp != Symbol.End)
- {
- if (temp == Symbol.Assign)
- {
- ParseEntity(buffer, symbols);
- buffer.Clear();
- // skip linebreaks behind an entity
- temp = symbols.NextNonEOLSymbol();
- }
- else
- {
- buffer.Add(temp);
- temp = symbols.NextSymbol();
- }
- }
- }
- private void ParseEntity(SymbolList preAssignSymbols, ISymbolEnumerator symbols)
- {
- if ((preAssignSymbols == null) || (preAssignSymbols.Count == 0))
- {
- Symbol s = symbols.NextSymbol();
- if (s != null)
- {
- s.Assert(false, "Invalid Entity declaration");
- }
- else
- {
- throw new MibException("Invalid Entity declaration");
- }
- }
- // check for a valid identifier
- preAssignSymbols[0].AssertIsValidIdentifier();
-
- if (preAssignSymbols.Count == 1)
- {
- // its a typedef
- _tokens.Add(Lexer.ParseBasicTypeDef(this, preAssignSymbols[0].ToString(), symbols, isMacroSyntax: false));
- return;
- }
- ISymbolEnumerator preAssignSymbolsEnumerator = preAssignSymbols.GetSymbolEnumerator();
- preAssignSymbolsEnumerator.NextNonEOLSymbol(); // returns identifier
- Symbol type = preAssignSymbolsEnumerator.NextNonEOLSymbol();
- // parse declarations
- if (type == Symbol.Object)
- {
- Symbol next = preAssignSymbolsEnumerator.NextNonEOLSymbol();
- if (next == Symbol.Identifier)
- {
- _tokens.Add(new OidValueAssignment(this, preAssignSymbols, symbols));
- return;
- }
- else if (next != null)
- {
- preAssignSymbolsEnumerator.PutBack(next);
- }
- }
- if (type == Symbol.ModuleIdentity)
- {
- _tokens.Add(new ModuleIdentity(this, preAssignSymbols, symbols));
- return;
- }
- if (type == Symbol.ObjectType)
- {
- _tokens.Add(new ObjectType(this, preAssignSymbols, symbols));
- return;
- }
- if (type == Symbol.ObjectGroup)
- {
- _tokens.Add(new ObjectGroup(this, preAssignSymbols, symbols));
- return;
- }
- if (type == Symbol.NotificationGroup)
- {
- _tokens.Add(new NotificationGroup(this, preAssignSymbols, symbols));
- return;
- }
- if (type == Symbol.ModuleCompliance)
- {
- _tokens.Add(new ModuleCompliance(this, preAssignSymbols, symbols));
- return;
- }
- if (type == Symbol.NotificationType)
- {
- _tokens.Add(new NotificationType(this, preAssignSymbols, symbols));
- return;
- }
- if (type == Symbol.ObjectIdentity)
- {
- _tokens.Add(new ObjectIdentity(this, preAssignSymbols, symbols));
- return;
- }
- if (type == Symbol.Macro)
- {
- _tokens.Add(new Macro(this, preAssignSymbols, symbols));
- return;
- }
- if (type == Symbol.TrapType)
- {
- _tokens.Add(new TrapType(this, preAssignSymbols, symbols));
- return;
- }
- if (type == Symbol.AgentCapabilities)
- {
- _tokens.Add(new AgentCapabilities(this, preAssignSymbols, symbols));
- return;
- }
- preAssignSymbols[1].Assert(false, "Unknown/Invalid declaration");
- }
- #endregion
- }
- }
|