Better parsing. Added automatic adding files based in imports. Started mib module...
authorEbersold <aebersol@n3150.home>
Wed, 18 May 2022 21:06:49 +0000 (23:06 +0200)
committerEbersold <aebersol@n3150.home>
Wed, 18 May 2022 21:06:49 +0000 (23:06 +0200)
adt/asn1_meta.h
adt/asn1_meta.inc
adt/asn1_module.h
adt/asn1_node_mib_leaf.h [new file with mode: 0644]
adt/asn1_recursive_visitor.h
libparser/asn1.l
libparser/asn1.y
libparser/asn1_parser.cpp
libparser/asn1_parser.h

index dedb2c289216a7a9244ca4e8884c9c680a346f3d..0c84ce66fd773cf4958e5009aa68cd6fb16da7fe 100644 (file)
@@ -21,6 +21,13 @@ namespace asn1
         SNMP_MODULE_IDENT,     /* Mib MODULE-IDENTITY       */
         SNMP_TEXTUAL_CONV,     /* Mib TEXTUAL-CONVENTION    */
         SNMP_OBJECT_TYPE,      /* Mib OBJECT-TYPE           */
+        SNMP_NOTIFICATION_TYPE,
+        SNMP_OBJECT_IDENTITY,
+        SNMP_TRAP_TYPE,
+        SNMP_OBJECT_GROUP,
+        SNMP_NOTIFICATION_GROUP,
+        SNMP_MODULE_COMPLIANCE,
+        SNMP_AGENT_COMPTABILITIES,
         MAX
       } id;
       inline meta(meta::id id = INVALID) : m_id(id) {};
index 0e0342a2f0639f9c75ca163d8c3d5f61610a3322..00e3aa756fdbbf18325f06c5039051cacc93fc7b 100644 (file)
@@ -11,7 +11,17 @@ ASSIGNMENT(OBJECTCLASS,objectclass,assignment)
 ASSIGNMENT(OBJECTSET,objectset,assignment)
 ASSIGNMENT(OBJECTFIELD,objectfield,assignment)
 
-ASSIGNMENT(SNMP_MODULE_IDENT,snmp_mib_identity,assignment)
-ASSIGNMENT(SNMP_TEXTUAL_CONV,snmp_mib_tc,assignment)
-ASSIGNMENT(SNMP_OBJECT_TYPE,snmp_mib_object_type,assignment)
+ASSIGNMENT(SNMP_MODULE_IDENT,mib_module_identity,assignment)
+ASSIGNMENT(SNMP_TEXTUAL_CONV,mib_tc,assignment)
+ASSIGNMENT(SNMP_OBJECT_TYPE,mib_object_type,assignment)
+ASSIGNMENT(SNMP_NOTIFICATION_TYPE,mib_notification_type,assignment)
+ASSIGNMENT(SNMP_OBJECT_IDENTITY,mib_object_identity,assignment)
+ASSIGNMENT(SNMP_TRAP_TYPE,mib_trap_type,assignment)
+ASSIGNMENT(SNMP_OBJECT_GROUP,mib_object_group,assignment)
+ASSIGNMENT(SNMP_NOTIFICATION_GROUP,mib_notification_group,assignment)
+ASSIGNMENT(SNMP_MODULE_COMPLIANCE,mib_module_compliance,assignment)
+ASSIGNMENT(SNMP_AGENT_COMPTABILITIES,mib_agent_compatibilities,assignment)
+
+
+
 #undef ASSIGNMENT
index a2431261f252113141745c567273853532159ce3..1d7b70518c64558d0a66f71f4b4324dc7e627f02 100644 (file)
@@ -105,7 +105,26 @@ class module : public asn1::constructed
       return !m_s.compare(n->name());
     };
 
-}
+/**
+ * @brief mib_module is a module that defines mib objects.
+ * As is very different compared to an asn1 module
+ *
+ */
+class mib : public module
+{
+  private:
+    
+  public:
+    /// Default mib module constructor
+    mib(const char *_name);
+    /// Default mib module desctructor
+    virtual ~mib();
+};
+
+} /* end of asn1 namespace */
+
+
+
 
 /**
 vim:et:sw=2:ts=2
diff --git a/adt/asn1_node_mib_leaf.h b/adt/asn1_node_mib_leaf.h
new file mode 100644 (file)
index 0000000..3604c1d
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef ASN1_NODE_MIB_LEAF_H__
+#define ASN1_NODE_MIB_LEAF_H__
+
+
+/**
+ * TODO: Not sur if the type is appropriate. 
+ * I'm more thinking of mib_object which is not 
+ * 100% true either
+ *
+ */
+class mib_leaf : public constructed
+{
+  public:
+    typedef std::string                         syntax_type;
+    typedef std::string                         oid_type;
+  public:
+    /// Default constructor
+    mib_leaf();  
+    /// Default destructor
+    virtual ~mib_leaf() ;
+
+   syntax_type get_syntax() { return m_syntax; } const;
+  protected:
+    oid_type     m_oid;
+    syntax_type  m_syntax; // There is a syntax
+};
+
+
+
+#endif
index 1eb3802e46a87a323316d95b5012cd0e9d01dc8e..e3d46a3a6e89a7d3e2bbfa0278b029da26f078a3 100644 (file)
@@ -385,9 +385,17 @@ DEF_TRAVERSE_ASSIGN(objectset,{
 })
 DEF_TRAVERSE_ASSIGN(objectfield,{})
 
-DEF_TRAVERSE_ASSIGN(snmp_mib_identity,{})
-DEF_TRAVERSE_ASSIGN(snmp_mib_tc,{})
-DEF_TRAVERSE_ASSIGN(snmp_mib_object_type,{})
+DEF_TRAVERSE_ASSIGN(mib_module_identity,{})
+DEF_TRAVERSE_ASSIGN(mib_tc,{})
+DEF_TRAVERSE_ASSIGN(mib_object_type,{})
+DEF_TRAVERSE_ASSIGN(mib_notification_type,{})
+DEF_TRAVERSE_ASSIGN(mib_object_identity,{})
+DEF_TRAVERSE_ASSIGN(mib_trap_type,{})
+DEF_TRAVERSE_ASSIGN(mib_object_group,{})
+DEF_TRAVERSE_ASSIGN(mib_notification_group,{})
+DEF_TRAVERSE_ASSIGN(mib_module_compliance,{})
+DEF_TRAVERSE_ASSIGN(mib_agent_compatibilities,{})
+
 
 /* Implementation Traverse type */
 
index bb5e64787832171c856f8a7847c47f661aadea27..f1ec89f0b0091c3def7d4d4106b76ee40cb81951 100644 (file)
@@ -174,7 +174,7 @@ ALL             TOK(T_ALL)
 <INITIAL>APPLICATION     TOK(T_APPLICATION)
 <INITIAL>AUTOMATIC       TOK(T_AUTOMATIC)
 <INITIAL>BEGIN           TOK(T_BEGIN)
-<snmp>BITS      TOK(T_BIT)
+<snmp>BITS               TOK(T_BITS)
 <INITIAL,snmp>BIT             TOK(T_BIT)
 
 <INITIAL,snmp>BMPString       TOK(T_BMPString)
@@ -287,12 +287,12 @@ IMPORTS             {
 <snmp>AGENT-COMPABILITIES SNMP_TOK(T_MACRO_NAME)
 
 <snmp_imports>{
-       {Identifier}           NODE_TOK(T_IDENTIFIER)
-       {String_Literal}       NODE_TOK(T_IDENTIFIER)
-       {CapitalReference}     NODE_TOK(T_CAPITALREFERENCE)
+        {Identifier}           NODE_TOK(T_IDENTIFIER)
+        {String_Literal}       NODE_TOK(T_IDENTIFIER)
+        {CapitalReference}     NODE_TOK(T_CAPITALREFERENCE)
         {TypeReference}        NODE_TOK(T_TYPEREFERENCE)
-       "{"                    TOK(T_LBRACET)
-       "}"                    TOK(T_RBRACET)
+        "{"                    TOK(T_LBRACET)
+        "}"                    TOK(T_RBRACET)
         ","                    TOK(T_COMMA)
         ";"                    {
                                  yy_pop_state(); 
@@ -327,8 +327,8 @@ IMPORTS             {
         UNITS                  TOK(T_UNITS)
         VARIABLES              TOK(T_VARIABLES)
         WRITE-SYNTAX           TOK(T_WRITE_SYNTAX)
-       {Identifier}           NODE_TOK(T_IDENTIFIER)
-       {CapitalReference}     NODE_TOK(T_CAPITALREFERENCE)
+        {Identifier}           NODE_TOK(T_IDENTIFIER)
+        {CapitalReference}     NODE_TOK(T_CAPITALREFERENCE)
         {TypeReference}        NODE_TOK(T_TYPEREFERENCE)
         \"[^\"]*\"             { /* QUOTED STRING */
                                  yylval->node = new asn1::node(yytext);
index 5d0550996f824099c75ae699d3b4814574f4f9b9..2478924cc1d16d90d2c12856432ef731d959cb5c 100644 (file)
@@ -174,6 +174,8 @@ static asn1::classdef *gCurrentClassDef = NULL;
 \r
 %}\r
 \r
+%right T_ASSIGN\r
+\r
 %token T_ABSENT\r
 %token T_ABSTRACT\r
 %token T_ABSTRACT_SYNTAX\r
@@ -612,6 +614,11 @@ import:
        $<node>3->identifier($5);\r
        $<node>3->name($5->name());\r
        m->enter_symbol($<node>3,$<node>3->type_id()());\r
+       if (asn1::parser::instance()->is_mode_mib())\r
+       { // New attempt to add files direcly for paring\r
+         asn1::parser *p = asn1::parser::instance();\r
+         p->add_file($<node>5->name());\r
+       }\r
     }\r
 ;\r
 \r
@@ -2197,6 +2204,9 @@ type: opt_tag builtin_type opt_constraint_def {
         $$->as_typenode()->constraint($3);\r
         $$->tag($1);\r
   }\r
+ | T_BITS {\r
+        ASN_LOG_DEBUG( "type: T_BITS");\r
+ }\r
 ;\r
 \r
 builtin_type: boolean_def \r
@@ -3262,39 +3272,39 @@ defined_syntax_token:
 snmp_assignment: snmp_module_identity\r
  {\r
     ASN_LOG_DEBUG("snmp_assignment :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_module_identity_assignment($<node>1->name()); \r
   }\r
   | snmp_textual_convention  {\r
     ASN_LOG_DEBUG("snmp_textual_convention:");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_tc_assignment($<node>1->name()); \r
   }\r
   | snmp_object_type {\r
     ASN_LOG_DEBUG("snmp_object_type :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_object_type_assignment($<node>1->name()); \r
   }\r
   | snmp_notification_type {\r
     ASN_LOG_DEBUG("snmp_notification_type :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_notification_type_assignment($<node>1->name()); \r
   }\r
   | snmp_trap_type {\r
     ASN_LOG_DEBUG("snmp_notification_type :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_trap_type_assignment($<node>1->name()); \r
   }\r
   | snmp_notification_group {\r
     ASN_LOG_DEBUG("snmp_notification_group :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_notification_group_assignment($<node>1->name()); \r
   }\r
   | snmp_module_compliance {\r
     ASN_LOG_DEBUG("snmp_object_type :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_module_compliance_assignment($<node>1->name()); \r
   }\r
   | snmp_object_group {\r
     ASN_LOG_DEBUG("snmp_object_group :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_object_group_assignment($<node>1->name()); \r
   }\r
   | snmp_object_identity {\r
     ASN_LOG_DEBUG("snmp_object_identity :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_object_identity_assignment($<node>1->name()); \r
   }\r
 ;\r
 \r
@@ -3318,6 +3328,7 @@ snmp_module_identity: T_IDENTIFIER T_MACRO_NAME {
     ASN_LOG_DEBUG("snmp_module_identity: %s end",$1->name().c_str());\r
     asn1::module *m = get_current_module();\r
     asn1::node *ids = m->leave_context();\r
+    ids->set_parent(m->current_context());\r
     $<node>$ = ids;\r
     $<node>$ = $<node>1;\r
 }\r
@@ -3327,7 +3338,7 @@ snmp_mi_attributes: snmp_mi_last_update
   snmp_mi_organization\r
   snmp_mi_contact\r
   snmp_description\r
-  snmp_mi_revisions {\r
+  snmp_mi_revision_part {\r
     ASN_LOG_DEBUG("snmp_mi_attributes: end");\r
 }\r
 ;\r
@@ -3345,6 +3356,10 @@ snmp_mi_contact: T_CONTACT_INFO T_QUOTED_STRING {
   }\r
 ;\r
 \r
+snmp_mi_revision_part: /*Empty*/ \r
+  | snmp_mi_revisions\r
+;\r
+\r
 snmp_mi_revisions: snmp_mi_revision {\r
   }\r
   | snmp_mi_revision snmp_mi_revisions {\r
@@ -3387,8 +3402,8 @@ snmp_tc_reference: /* can be null */
 };\r
 \r
 snmp_tc_syntax: /* can be null */\r
-  | T_SYNTAX type_assign_right opt_constraint_def {\r
-};\r
+  | T_SYNTAX snmp_syntax\r
+;\r
 \r
 /** SNMP OBJECT-TYPE  */\r
 snmp_object_type: T_IDENTIFIER T_MACRO_OBJECT_TYPE snmp_ot_attributes \r
@@ -3404,9 +3419,8 @@ snmp_ot_attributes: snmp_ot_syntax
   snmp_ot_access\r
   snmp_ot_status\r
   snmp_description\r
-  snmp_ot_index\r
-  snmp_ot_augments\r
   snmp_ot_reference\r
+  snmp_ot_index_part\r
   snmp_ot_defval\r
 ;\r
 \r
@@ -3436,13 +3450,11 @@ snmp_ot_status: T_STATUS T_IDENTIFIER {
   }\r
 ;\r
 \r
-snmp_ot_augments: /**/\r
-  | T_AUGMENTS T_LBRACET snmp_ot_indexes T_RBRACET {\r
-  }\r
-;\r
-snmp_ot_index: /**/\r
+snmp_ot_index_part: /**/\r
   | T_INDEX T_LBRACET snmp_ot_indexes T_RBRACET {\r
   }\r
+  | T_AUGMENTS T_LBRACET snmp_ot_indexes T_RBRACET {\r
+  }\r
 ;\r
 snmp_ot_indexes: T_IDENTIFIER  {\r
   }\r
@@ -3514,6 +3526,8 @@ snmp_mc_module: T_MODULE snmp_mc_module_name
 \r
 snmp_mc_module_name: /* Empty */\r
   | T_IDENTIFIER\r
+  | T_TYPEREFERENCE\r
+  | T_CAPITALREFERENCE\r
 ;\r
 \r
 snmp_mc_mandatory_groups: T_MANDATORY_GROUPS T_LBRACET snmp_mc_mandatories T_RBRACET\r
@@ -3548,8 +3562,7 @@ snmp_mc_object: T_OBJECT T_IDENTIFIER
 \r
 /* Need to find out what kind of syntax it is about here */\r
 snmp_mc_obj_syntax: /**/\r
-  | T_SYNTAX  type\r
-  | T_SYNTAX  T_BITS T_LBRACET constant_list T_RBRACET\r
+  | T_SYNTAX  snmp_syntax \r
   | T_WRITE_SYNTAX  type_assign_right opt_constraint_def\r
 ; \r
   \r
@@ -3594,11 +3607,15 @@ snmp_notification_type: T_IDENTIFIER  T_MACRO_NOTIFICATION_TYPE
     $<node>$ = $<node>1;\r
 };\r
 \r
-snmp_nt_attributes: snmp_objects\r
+snmp_nt_attributes: snmp_nt_objects\r
   snmp_status \r
   snmp_description {\r
 };\r
 \r
+snmp_nt_objects: snmp_objects\r
+  | /* empty*/\r
+;\r
+\r
 /** SNMP  NOTIFICATION-GROUP  */\r
 snmp_notification_group: T_IDENTIFIER  T_MACRO_NOTIFICATION_GROUP \r
     snmp_ng_attributes {\r
@@ -3641,6 +3658,14 @@ snmp_oi_attributes:
   snmp_description {\r
 };\r
 \r
+ /* SNMP SYNTAX rule. Based on type assign right without parameters*/\r
+\r
+snmp_syntax: complex_type_reference opt_constraint_def\r
+  | complex_type_reference T_LBRACET constant_list T_RBRACET\r
+  | builtin_type opt_constraint_def\r
+  | T_BITS T_LBRACET constant_list T_RBRACET \r
+;\r
+\r
 /*\r
  *\r
  */\r
index f8f26a8a46d9db666df726f3f4ec53332165151d..cf89039bcd21de10e346167404bab56bff88531e 100644 (file)
@@ -78,6 +78,7 @@ int _asn1_wrap()
             asn1p->files().pop_back();
             return  0;
         } else {
+            std::cout<<"Not Found File : "<<fullname<<std::endl;
             return 1;
         }
       } else 
@@ -90,6 +91,25 @@ int _asn1_wrap()
 namespace asn1
 {
 
+#define CALL_LISTENER(event,type)             \
+struct got_##type                               \
+{                                               \
+  got_##type(asn1::##type *c) : m_c(c) {};      \
+  void operator ()(parser_listener *l)          \
+  {                                             \
+    l->##event (m_c);                           \
+  }                                             \
+  asn1::##type *m_c;                            \
+};
+
+#define NOTIFY_LISTENERS(call,arg)    \
+    std::for_each(m_listeners.begin() \
+                 , m_listeners.end()  \
+                 ,call (arg));
+
+
+// Example: CALL_LISTENER(onConstraint,constraint)
+
 //
 struct got_constraint
 {
@@ -252,6 +272,18 @@ parser::got_act_parameter(asn1::node *c)
   pl->add_parameter(c);
 }
 
+
+void 
+parser::add_file(const std::string &_from)
+{
+  // Be sur the file is not already in there
+  if (std::find(m_files.begin(),m_files.end(),_from) == m_files.end())
+  {
+    std::cout<<"ADD_FILE: "<<_from<<std::endl;
+    m_files.push_back(_from);
+  }
+}
+
 int 
 parser::parse()
 {
index 8920c615dabcb054da906d57583ede776364d311..9194a26bd0a265de12a28ce923be439bcd2fb776 100644 (file)
@@ -87,7 +87,10 @@ class parser
     inline string_list &files()     { return m_files;    }
     inline bool         file_mode() { return m_file_mode;}
     inline void set_file_mode(bool fm)
-    { m_file_mode = fm;}    
+    { m_file_mode = fm;}   
+
+    /// Add file from import
+    void add_file(const std::string &_from);
   private:
     parser() 
       : m_file_mode(false) , m_root(NULL),m_mode("asn1")