continued working on mib parsing master
authorEbersold <aebersol@n3150.home>
Sun, 25 Sep 2022 16:49:01 +0000 (18:49 +0200)
committerEbersold <aebersol@n3150.home>
Sun, 25 Sep 2022 16:49:01 +0000 (18:49 +0200)
15 files changed:
adt/asn1_node.cpp
adt/asn1_node.h
adt/asn1_node_assignment.cpp
adt/asn1_node_assignment.h
adt/asn1_node_field.cpp
adt/asn1_node_field.h
adt/asn1_node_valuetype.cpp
adt/asn1_node_valuetype.h
adt/asn1_recursive_visitor.h
libgen/asn1_gen_hpp.cpp
libgen/asn1_gen_optimizer.cpp
libgen/cpp/cgcpph_object.cpp
libgen/cpp/cghpph_enumerated.cpp
libparser/asn1.l
libparser/asn1.y

index 7c297eb6dbe0e8d4715e663001ffe9222b87326a..a69d37035f7539b7d643b53bc2e9159122c78661 100644 (file)
@@ -33,9 +33,8 @@ node::node(const std::string name, meta  m ) : m_is_generated(CL_GREEN) ,
                 , m_constraints("VIDE")
                 , m_identifier(NULL)
                 ,m_parameters(NULL)
                 , m_constraints("VIDE")
                 , m_identifier(NULL)
                 ,m_parameters(NULL)
-                ,m_value(NULL)
                 ,m_type(NULL)
                 ,m_type(NULL)
-                       ,m_parent(NULL)      
+                ,m_parent(NULL)
                 ,m_marker(marker_type::FL_NONE)
 {
   m_tag.m_mode   = tag_type::TM_DEFAULT;
                 ,m_marker(marker_type::FL_NONE)
 {
   m_tag.m_mode   = tag_type::TM_DEFAULT;
@@ -68,10 +67,9 @@ node::node(const std::string name, type  t ,meta m ) : m_is_generated(CL_GREEN),
           ,m_constraints("VIDE")
           ,m_identifier(NULL)
           ,m_parameters(NULL)
           ,m_constraints("VIDE")
           ,m_identifier(NULL)
           ,m_parameters(NULL)
-             ,m_parent(NULL)        
-          ,m_value(NULL)
-                ,m_type(NULL)
-                ,m_marker(marker_type::FL_NONE)
+          ,m_parent(NULL)
+          ,m_type(NULL)
+          ,m_marker(marker_type::FL_NONE)
 {
   m_marker.m_flags = marker_type::FL_NONE; 
   m_tag.m_mode   = tag_type::TM_DEFAULT;
 {
   m_marker.m_flags = marker_type::FL_NONE; 
   m_tag.m_mode   = tag_type::TM_DEFAULT;
@@ -243,10 +241,9 @@ node::node(const node &n) : m_is_generated(n.m_is_generated),m_meta(n.m_meta),m_
           ,m_identifier(NULL)
           ,m_tag(n.m_tag)
           ,m_parameters(NULL)
           ,m_identifier(NULL)
           ,m_tag(n.m_tag)
           ,m_parameters(NULL)
-          ,m_value(n.m_value)
           ,m_type(n.m_type)
           ,m_uid(n.m_uid)
           ,m_type(n.m_type)
           ,m_uid(n.m_uid)
-          ,m_parent(n.m_parent)     
+          ,m_parent(n.m_parent)
 {
 }
 
 {
 }
 
@@ -259,7 +256,6 @@ node::node(const char *name) :m_is_generated(CL_GREEN) , m_ref(0), m_name(name)
                 ,m_constraints("")
                 ,m_identifier(NULL)
                 ,m_parameters(NULL)
                 ,m_constraints("")
                 ,m_identifier(NULL)
                 ,m_parameters(NULL)
-                ,m_value(NULL)
                 ,m_type(NULL)
                 ,m_parent(NULL)   
                 ,m_marker(marker_type::FL_NONE)
                 ,m_type(NULL)
                 ,m_parent(NULL)   
                 ,m_marker(marker_type::FL_NONE)
index 23abb71433ed4291b144d39ead16552807724014..3ce817537ac0ffebfa3987c006def6b8892b8954 100644 (file)
@@ -208,10 +208,6 @@ namespace asn1
       inline void type_id(asn1::type::id t) { m_type_id = t; }
 
       inline type type_id() const {return m_type_id;};
       inline void type_id(asn1::type::id t) { m_type_id = t; }
 
       inline type type_id() const {return m_type_id;};
-      
-      inline asn1::value *value() const { return m_value;};
-
-      inline void value(asn1::value *v) {m_value =v;};      
       // Meta stuff
       inline void meta_id(asn1::meta::id m) {m_meta = m;}
       
       // Meta stuff
       inline void meta_id(asn1::meta::id m) {m_meta = m;}
       
@@ -329,7 +325,6 @@ namespace asn1
       node          *m_next;
       
       node              *m_type;   // 2011/05/03 must be deprecated
       node          *m_next;
       
       node              *m_type;   // 2011/05/03 must be deprecated
-      asn1::value       *m_value;  // Should become part of valuetype
       node              *m_identifier;
       asn1::constructed *m_parameters;
       asn1::constraint  m_constraints;
       node              *m_identifier;
       asn1::constructed *m_parameters;
       asn1::constraint  m_constraints;
index 7911d2a2b35dca7c6e3a3a489df1508d5b9f1020..48d5137622f181a708ce3dbe6ddd9a1f252f7543 100644 (file)
@@ -44,6 +44,16 @@ assignment::get_objectset() const
   return reinterpret_cast<objectset *>(type_node());
 }
 
   return reinterpret_cast<objectset *>(type_node());
 }
 
+constraint *
+assignment::get_constraint() const
+{
+ valueset *v = reinterpret_cast<valueset *>(type_node());
+ if (v != nullptr ) 
+   return v->get_constraint();
+ return nullptr;
+}
+
+
 parameter *
 assignment::have_parameter(asn1::node *actp,long &idx)
 {
 parameter *
 assignment::have_parameter(asn1::node *actp,long &idx)
 {
index 6d0714194be1b6be9f5db5d6a59ebfdbddfa643f..b59b5d6a3fddf0039aece8e022b7bc5ec6a2cdff 100644 (file)
@@ -24,8 +24,11 @@ class assignment : public node
     // Should replace node with typenode
     void set_type(asn1::node *n);
 
     // Should replace node with typenode
     void set_type(asn1::node *n);
 
-    typenode  *get_type() const;
-    objectset *get_objectset() const;
+    typenode   *get_type() const;
+    
+    objectset  *get_objectset() const;
+    /// a valueset assignement content is constraints
+    constraint *get_constraint() const;
     /**
      * node is an act_parameter ...
      */ 
     /**
      * node is an act_parameter ...
      */ 
@@ -34,6 +37,7 @@ class assignment : public node
 };
 
 #define ASSIGNMENT(tp,cls,parent) \
 };
 
 #define ASSIGNMENT(tp,cls,parent) \
+    class cls; \
     class cls ## _assignment : public parent \
     {\
       public:\
     class cls ## _assignment : public parent \
     {\
       public:\
@@ -44,6 +48,11 @@ class assignment : public node
         {}; \
        ~cls ## _assignment () {}; \
        cls ## _assignment *clone() { return new cls ## _assignment(*this);}; \
         {}; \
        ~cls ## _assignment () {}; \
        cls ## _assignment *clone() { return new cls ## _assignment(*this);}; \
+      private:           \
+        cls * m_## cls ; \
+      public:            \
+        cls * aget_## cls() const {return m_## cls; }     \
+        void  set_## cls( cls *_v ) { m_## cls = _v ; } ; \
     };
 
 #include "asn1_meta.inc"
     };
 
 #include "asn1_meta.inc"
index 5cc49ea95c1b34cce00180b8106f009e9ba31af9..781739059ea80cf4f0e6081d0f864f70e94b91cc 100644 (file)
@@ -149,5 +149,14 @@ classfield_osf::get_type() const
   return reinterpret_cast<typenode *>(type_node());
 }
 
   return reinterpret_cast<typenode *>(type_node());
 }
 
+value *
+classfield_osf::get_value() const
+{
+  asn1::value *v =  reinterpret_cast<value *>(type_node());
+  std::cout<<"classfield_osf::get_value "<<typeid(*type_node()).name()<<std::endl;
+  //assert(v!=null);
+  return v;
+}
+
 
 }
 
 }
index 6519713679e1a2a0aeaf25eeae70ddf59f1f8013..86360c18e2495c07a5e5e0261a78de8730330c2f 100644 (file)
@@ -111,6 +111,7 @@ class classfield : public node
                  , asn1::typeref *t            \
                  , type _t = asn1::type::ASN1_CLASSFIELD_OSF) ; \
     typeref *get_typeref() const; \
                  , asn1::typeref *t            \
                  , type _t = asn1::type::ASN1_CLASSFIELD_OSF) ; \
     typeref *get_typeref() const; \
+    value   *get_value() const; \
     typenode *get_type() const;
 
 #define ASN1_CLASSFIELD_TYPE(cls,parent,tp) \
     typenode *get_type() const;
 
 #define ASN1_CLASSFIELD_TYPE(cls,parent,tp) \
index 165f332131fe2b5f61b72e35dcbbdcb548db83db..da199dc2fce99c3647127d5f7c0f893ffba29c9a 100644 (file)
@@ -76,6 +76,16 @@ valueset::get_typeref()
   return NULL;
 }
 
   return NULL;
 }
 
+asn1::constraint *
+valueset::get_constraint() const
+{
+  if (m_constraints.size() >= 1)
+  {
+    return *(m_constraints.begin());
+  }
+  return NULL;
+}
+
 /**
  * objectset  
  */ 
 /**
  * objectset  
  */ 
@@ -94,4 +104,16 @@ objectset::set_classref(asn1::typeref *ref)
   m_classref = ref;
 }
 
   m_classref = ref;
 }
 
+
+asn1::constraint *
+objectset::get_constraint() const
+{
+  if (m_constraints.size() >= 1)
+  {
+    return *(m_constraints.begin());
+  }
+  return NULL;
+}
+
+
 }
 }
index e04815b44abf6343985ca6be35a787478abd1b37..82d54b495742fdd343a35fd3d79578f4c0ca6837 100644 (file)
@@ -22,6 +22,9 @@ class objectset_assignment;
  */ 
 class valuetype : public node 
 {
  */ 
 class valuetype : public node 
 {
+  private:
+    // No copy contructor
+    valuetype(const valuetype &_b) : node(_b) {};
   public:
     
     valuetype(asn1::value *_val,meta _m = meta::VALUE); 
   public:
     
     valuetype(asn1::value *_val,meta _m = meta::VALUE); 
@@ -36,7 +39,12 @@ class valuetype : public node
     void value_long(long long l) ;
 
     long long value_long() const ;
     void value_long(long long l) ;
 
     long long value_long() const ;
-  protected:  
+    /// New from node
+    inline asn1::value *value() const { return m_value;};
+
+    inline void value(asn1::value *v) {m_value =v;};      
+  private:  
+      asn1::value       *m_value;  // Should become part of valuetype
 };
 
 /**
 };
 
 /**
@@ -56,6 +64,10 @@ class valueset : public typenode
      * Specific for Rose .... 
      */   
     asn1::typeref *get_typeref();
      * Specific for Rose .... 
      */   
     asn1::typeref *get_typeref();
+    /**
+     * return constraint from value set
+     */
+    asn1::constraint *get_constraint() const;
   protected:
 
 };
   protected:
 
 };
@@ -80,6 +92,10 @@ class objectset : public typenode
 
     asn1::typeref *get_classref() const 
     { return m_classref; }
 
     asn1::typeref *get_classref() const 
     { return m_classref; }
+    /**
+     * return constraint from value set
+     */
+    asn1::constraint *get_constraint() const;
   protected:
     asn1::typeref *m_classref;
 
   protected:
     asn1::typeref *m_classref;
 
index e3d46a3a6e89a7d3e2bbfa0278b029da26f078a3..ea484c4b9bca7041ecdfc30938b624908e69d3c3 100644 (file)
@@ -359,9 +359,9 @@ DEF_TRAVERSE_ASSIGN(typeref,{})
 DEF_TRAVERSE_ASSIGN(type,{})
 DEF_TRAVERSE_ASSIGN(value,{})
 DEF_TRAVERSE_ASSIGN(valueset,{
 DEF_TRAVERSE_ASSIGN(type,{})
 DEF_TRAVERSE_ASSIGN(value,{})
 DEF_TRAVERSE_ASSIGN(valueset,{
-  if ( asn1::value *v = S->value())
+  if ( asn1::constraint *_constraint = S->get_constraint())
   {
   {
-    traverse_constraint(v->m_constraint);
+    traverse_constraint(_constraint);
   } 
 })
 DEF_TRAVERSE_ASSIGN(object,{
   } 
 })
 DEF_TRAVERSE_ASSIGN(object,{
@@ -418,16 +418,16 @@ DEF_TRAVERSE_TYPE(exportvar,{})
 DEF_TRAVERSE_TYPE(extensible,{}) 
 DEF_TRAVERSE_TYPE(components_of,{}) 
 DEF_TRAVERSE_TYPE(valueset,{
 DEF_TRAVERSE_TYPE(extensible,{}) 
 DEF_TRAVERSE_TYPE(components_of,{}) 
 DEF_TRAVERSE_TYPE(valueset,{
-  if ( asn1::value *v = S->value())
+  if ( asn1::constraint *v = S->get_constraint())
   {
   {
-    traverse_constraint(v->m_constraint);
+    traverse_constraint(v);
   } 
 })
 
 DEF_TRAVERSE_TYPE(objectset,{
   } 
 })
 
 DEF_TRAVERSE_TYPE(objectset,{
-  if ( asn1::value *v = S->value())
+  if ( asn1::constraint *v = S->get_constraint())
   {
   {
-    traverse_constraint(v->m_constraint);
+    traverse_constraint(v);
   } 
 })
 
   } 
 })
 
@@ -474,9 +474,15 @@ DEF_TRAVERSE_CLASSFIELD(classfield_osf,{
 {
   if (f)
   {
 {
   if (f)
   {
-    if ( asn1::value *v = f->value())
+    // f is a node. that contains a value
+    // as node does not contain value anymore. It's either valueset
+    // or object set
+    if ( asn1::constraint *v = dynamic_cast<objectset *>(f)->get_constraint())
     {
     {
-      traverse_constraint(v->m_constraint);
+      traverse_constraint(v);
+    } else
+    {
+      std::cerr<<"recursive travers : classfield_ofs "<<typeid(*f).name()<<" Not objectset"<<std::endl;
     }
   }
   }
     }
   }
   }
index df25b9a7338af9d406ffd63cf520ce0cd5d47944..c3275a66b5b8150e1d9eca7c7c6d17b2922dca65 100644 (file)
@@ -401,7 +401,8 @@ void  generate_header::gen_const(std::ostream &os,asn1::node *n)
       GEN_LOG_DEBUG( "value integer %s\n"
                    , type->identifier_name().c_str());
       os<<"#define "<<type->identifier_cpp_name();
       GEN_LOG_DEBUG( "value integer %s\n"
                    , type->identifier_name().c_str());
       os<<"#define "<<type->identifier_cpp_name();
-      os<<"\t "<<n->value()->cpp_name()<<"";
+      //os<<"\t "<<n->value()->cpp_name()<<"";
+      os<<"\t "<<dynamic_cast<asn1::value_assignment *>(n)->aget_value()->cpp_name()<<"";
     }
     break;
     case asn1::type::ASN1_REFERENCE:
     }
     break;
     case asn1::type::ASN1_REFERENCE:
@@ -416,7 +417,8 @@ void  generate_header::gen_const(std::ostream &os,asn1::node *n)
     break;
     default:
     {
     break;
     default:
     {
-      asn1::value *v = n->value();
+      //asn1::value *v = n->value();
+      asn1::value *v = dynamic_cast<asn1::value_assignment *>(n)->aget_value();
       GEN_LOG_DEBUG("default case %s\n",type->identifier_name().c_str());
       assert(v != NULL);
       switch (v->type)
       GEN_LOG_DEBUG("default case %s\n",type->identifier_name().c_str());
       assert(v != NULL);
       switch (v->type)
index 94d3af3f28c1940c564242764eba19eabbf9816a..d099a0d1cac7a1f10270534a93add2f2705c67ac 100644 (file)
@@ -306,7 +306,8 @@ class optimize_phase1 : public asn1::recursive_visitor<optimize_phase1>
       );
       if (v && v->m_node->type_id()() == 0)
       {
       );
       if (v && v->m_node->type_id()() == 0)
       {
-        asn1::constructed *vn = v->m_node->value()->m_node->as_constructed();
+        //asn1::constructed *vn = v->m_node->value()->m_node->as_constructed();
+        asn1::constructed *vn = dynamic_cast<asn1::valuetype *>(v->m_node)->value()->m_node->as_constructed();
         std::cerr<<__FUNCTION__<<" Proccess ftvf because of wrong id ";
         std::cerr<<"<"<<v->m_node->cpp_name()<<"> "<<typeid(*(v->m_node)).name()<<std::endl;
         assert((vn != NULL) && " VN should be constructed ");
         std::cerr<<__FUNCTION__<<" Proccess ftvf because of wrong id ";
         std::cerr<<"<"<<v->m_node->cpp_name()<<"> "<<typeid(*(v->m_node)).name()<<std::endl;
         assert((vn != NULL) && " VN should be constructed ");
index df7bdda9bd9d813612e2c8e2bcad2cc0f1453f70..eac50922b1f24108cbfcb417e009237181ef62f8 100644 (file)
@@ -361,7 +361,11 @@ class ftvf_init : public node_visitor<ftvf_init>
 
     void visit_choice(asn1::choice *type)
     {
 
     void visit_choice(asn1::choice *type)
     {
-      asn1::value *val = type->value(); 
+      //asn1::value *val = type->value(); 
+      asn1::valuetype *vt = reinterpret_cast<asn1::valuetype *>(type); 
+      asn1::value *val = (vt != nullptr)?vt->value():nullptr;
+      std::cout<<"ftvf::visit_choice type is :"<<typeid(*type).name()<<" vt "<<vt<<" val="<<val<<std::endl;
+      assert(val != nullptr); 
       m_os<<"\t// FTVF CHOICE "<<type->cpp_name()<<" "<<val->cpp_name()<<std::endl;
       switch (val->m_node->type_id()())
       {
       m_os<<"\t// FTVF CHOICE "<<type->cpp_name()<<" "<<val->cpp_name()<<std::endl;
       switch (val->m_node->type_id()())
       {
index 6c5ecf35a646024af429991d011474755428502e..2f5e263c9c22cee567c7d25b4952b54c51fcafc4 100644 (file)
@@ -81,7 +81,8 @@ void cghpph_enumerated::generate_members( )
   m_os<<"\tenum e"<< m_structName<<"  {\n";
   for (; it != m_enumerated.end();++it)
   {
   m_os<<"\tenum e"<< m_structName<<"  {\n";
   for (; it != m_enumerated.end();++it)
   {
-    asn1::value *num = (*it)->value();
+    asn1::valuetype *vt = dynamic_cast<asn1::valuetype *>(*it);
+    asn1::value *num = (vt == nullptr)?NULL:vt->value();
     if (it != m_enumerated.begin() )
       m_os<<",\n";
     m_os<<"\t\t"<<(*it)->cpp_name()<<" ";
     if (it != m_enumerated.begin() )
       m_os<<",\n";
     m_os<<"\t\t"<<(*it)->cpp_name()<<" ";
index f1ec89f0b0091c3def7d4d4106b76ee40cb81951..065497735e47932acf5eb6b790938a9094a5c690 100644 (file)
@@ -113,6 +113,7 @@ void _asn1_error(const char *s) {
 %x snmp_imports
 %x snmp
 %x snmp_quoted_string
 %x snmp_imports
 %x snmp
 %x snmp_quoted_string
+%x snmp_ignore
 
 /* */
 Digits          [0-9]+
 
 /* */
 Digits          [0-9]+
@@ -125,7 +126,7 @@ Real            [-+]?[0-9]+[.]?([eE][-+]?)?[0-9]+
 Char            ([^\n\t\"\'\\])
 Char_Literal    "'"({Char}|\")"'"
 String_Literal  \"({Char}|"'")*\"
 Char            ([^\n\t\"\'\\])
 Char_Literal    "'"({Char}|\")"'"
 String_Literal  \"({Char}|"'")*\"
-HString         '[0-9A-F \r\r\v\f\n]+'H
+HString         '[0-9A-Fa-f \r\r\v\f\n]+'[Hh]
 BString         '[01 \t\r\v\f\n]+'B
 Identifier      [a-z][a-zA-Z0-9]*([-][a-zA-Z0-9]+)*
 CapitalReference    [A-Z][A-Z0-9]*([-][A-Z0-9]+)*
 BString         '[01 \t\r\v\f\n]+'B
 Identifier      [a-z][a-zA-Z0-9]*([-][a-zA-Z0-9]+)*
 CapitalReference    [A-Z][A-Z0-9]*([-][A-Z0-9]+)*
@@ -171,7 +172,7 @@ wsp [\t\r\v\f\n ]
 <INITIAL>ABSTRACT-SYNTAX TOK(T_ABSTRACT_SYNTAX)
 ALL             TOK(T_ALL)
 <INITIAL>ANY             TOK(T_ANY)
 <INITIAL>ABSTRACT-SYNTAX TOK(T_ABSTRACT_SYNTAX)
 ALL             TOK(T_ALL)
 <INITIAL>ANY             TOK(T_ANY)
-<INITIAL>APPLICATION     TOK(T_APPLICATION)
+<INITIAL,snmp>APPLICATION     TOK(T_APPLICATION)
 <INITIAL>AUTOMATIC       TOK(T_AUTOMATIC)
 <INITIAL>BEGIN           TOK(T_BEGIN)
 <snmp>BITS               TOK(T_BITS)
 <INITIAL>AUTOMATIC       TOK(T_AUTOMATIC)
 <INITIAL>BEGIN           TOK(T_BEGIN)
 <snmp>BITS               TOK(T_BITS)
@@ -212,7 +213,7 @@ EMBEDDED
 <INITIAL,snmp>{HString}           TOK(T_hstring)
 <INITIAL,snmp>IA5String           TOK(T_IA5String)
 <INITIAL,snmp>IDENTIFIER          TOK(T_STR_IDENTIFIER)
 <INITIAL,snmp>{HString}           TOK(T_hstring)
 <INITIAL,snmp>IA5String           TOK(T_IA5String)
 <INITIAL,snmp>IDENTIFIER          TOK(T_STR_IDENTIFIER)
-<INITIAL>IMPLICIT            TOK(T_IMPLICIT)
+<INITIAL,snmp>IMPLICIT            TOK(T_IMPLICIT)
 <INITIAL>IMPLIED             TOK(T_IMPLIED)
 IMPORTS             {
                       if (gParser->is_mode_mib())
 <INITIAL>IMPLIED             TOK(T_IMPLIED)
 IMPORTS             {
                       if (gParser->is_mode_mib())
@@ -244,7 +245,7 @@ IMPORTS             {
 <INITIAL>PLUS-INFINITY
 <INITIAL>PRESENT             TOK(T_PRESENT)
 <INITIAL>PrintableString     TOK(T_PrintableString)
 <INITIAL>PLUS-INFINITY
 <INITIAL>PRESENT             TOK(T_PRESENT)
 <INITIAL>PrintableString     TOK(T_PrintableString)
-<INITIAL>PRIVATE
+<INITIAL,snmp>PRIVATE
 <INITIAL>REAL                TOK(T_REAL)
 <INITIAL>RELATIVE-OID        TOK(T_RELATIVE_OID)
 <INITIAL>RELATIVE-OID-IRI    TOK(T_RELATIVE_OID_IRI)
 <INITIAL>REAL                TOK(T_REAL)
 <INITIAL>RELATIVE-OID        TOK(T_RELATIVE_OID)
 <INITIAL>RELATIVE-OID-IRI    TOK(T_RELATIVE_OID_IRI)
@@ -263,7 +264,7 @@ IMPORTS             {
 <INITIAL>UNION               TOK(T_UNION)
 <INITIAL>UNITS               TOK(T_UNITS)
 <INITIAL>UNIQUE              TOK(T_UNIQUE)
 <INITIAL>UNION               TOK(T_UNION)
 <INITIAL>UNITS               TOK(T_UNITS)
 <INITIAL>UNIQUE              TOK(T_UNIQUE)
-<INITIAL>UNIVERSAL           TOK(T_UNIVERSAL)
+<INITIAL,snmp>UNIVERSAL           TOK(T_UNIVERSAL)
 <INITIAL>UniversalString     TOK(T_UniversalString)
 
 <INITIAL>UTCTime             TOK(T_UTCTime)
 <INITIAL>UniversalString     TOK(T_UniversalString)
 
 <INITIAL>UTCTime             TOK(T_UTCTime)
@@ -284,8 +285,10 @@ IMPORTS             {
 <snmp>OBJECT-GROUP        SNMP_TOK(T_MACRO_OBJECT_GROUP)
 <snmp>NOTIFICATION-GROUP  SNMP_TOK(T_MACRO_NOTIFICATION_GROUP)
 <snmp>MODULE-COMPLIANCE   SNMP_TOK(T_MACRO_MODULE_COMPLIANCE)
 <snmp>OBJECT-GROUP        SNMP_TOK(T_MACRO_OBJECT_GROUP)
 <snmp>NOTIFICATION-GROUP  SNMP_TOK(T_MACRO_NOTIFICATION_GROUP)
 <snmp>MODULE-COMPLIANCE   SNMP_TOK(T_MACRO_MODULE_COMPLIANCE)
-<snmp>AGENT-COMPABILITIES SNMP_TOK(T_MACRO_NAME)
-
+<snmp>AGENT-CAPABILITIES SNMP_TOK(T_MACRO_NAME)
+<snmp>MACRO               { yy_push_state(snmp_ignore);
+                            return T_MACRO;
+                          }               
 <snmp_imports>{
         {Identifier}           NODE_TOK(T_IDENTIFIER)
         {String_Literal}       NODE_TOK(T_IDENTIFIER)
 <snmp_imports>{
         {Identifier}           NODE_TOK(T_IDENTIFIER)
         {String_Literal}       NODE_TOK(T_IDENTIFIER)
@@ -340,6 +343,10 @@ IMPORTS             {
         {wsp}+  /* ignore whitespace*/
 }
 
         {wsp}+  /* ignore whitespace*/
 }
 
+<snmp_ignore>{
+  END        { yy_pop_state(); /* Leave macro */ return T_END; }
+    .        { printf("%s",yytext);}
+}
 
 {Identifier}           NODE_TOK(T_IDENTIFIER)
 {String_Literal}       NODE_TOK(T_IDENTIFIER)
 
 {Identifier}           NODE_TOK(T_IDENTIFIER)
 {String_Literal}       NODE_TOK(T_IDENTIFIER)
@@ -361,8 +368,8 @@ IMPORTS             {
 "<"             TOK(T_LT)
 "@"             TOK(T_AT)
 "!"             TOK(T_EXCLAMATION)
 "<"             TOK(T_LT)
 "@"             TOK(T_AT)
 "!"             TOK(T_EXCLAMATION)
-"["             TOK(T_LBRACKET)
-"]"             TOK(T_RBRACKET)
+<INITIAL,snmp>"["             TOK(T_LBRACKET)
+<INITIAL,snmp>"]"             TOK(T_RBRACKET)
 <INITIAL,snmp>"{"             TOK(T_LBRACET)
 <INITIAL,snmp>"}"             TOK(T_RBRACET)
 <INITIAL,snmp>")"             TOK(T_RPARENTHESES)
 <INITIAL,snmp>"{"             TOK(T_LBRACET)
 <INITIAL,snmp>"}"             TOK(T_RBRACET)
 <INITIAL,snmp>")"             TOK(T_RPARENTHESES)
index 2478924cc1d16d90d2c12856432ef731d959cb5c..3bff06e6ce76559fbb00096288a5868d95f5a802 100644 (file)
@@ -234,6 +234,7 @@ static asn1::classdef *gCurrentClassDef = NULL;
 %token T_INTERSECTION\r
 %token T_LAST_UPDATED\r
 %token T_LT\r
 %token T_INTERSECTION\r
 %token T_LAST_UPDATED\r
 %token T_LT\r
+%token T_MACRO\r
 %token <node>T_MACRO_NAME\r
 %token <node>T_MACRO_NOTIFICATION_TYPE\r
 %token <node>T_MACRO_NOTIFICATION_GROUP\r
 %token <node>T_MACRO_NAME\r
 %token <node>T_MACRO_NOTIFICATION_TYPE\r
 %token <node>T_MACRO_NOTIFICATION_GROUP\r
@@ -933,13 +934,16 @@ tag_type:
     delete $2;\r
   }\r
 ;\r
     delete $2;\r
   }\r
 ;\r
+/*\r
 \r
 \r
-tag: \r
   tag_type {\r
     $$ = $1;\r
     $$.m_set  = true;\r
   }\r
   tag_type {\r
     $$ = $1;\r
     $$.m_set  = true;\r
   }\r
-  | T_LBRACKET tag_type T_RBRACKET {\r
+\r
+*/\r
+tag: \r
+  T_LBRACKET tag_type T_RBRACKET {\r
     ASN_LOG_DEBUG("tag: tag_type 1 [%d,%ld] ",$2.m_class,$2.m_value);\r
     $$ = $2;\r
     $$.m_set  = true;\r
     ASN_LOG_DEBUG("tag: tag_type 1 [%d,%ld] ",$2.m_class,$2.m_value);\r
     $$ = $2;\r
     $$.m_set  = true;\r
@@ -976,8 +980,16 @@ opt_tag:
 default: T_DEFAULT value {\r
     ASN_LOG_DEBUG("default: with value");\r
     $$ = new asn1::node::marker_type(asn1::node::marker_type::FL_DEFAULT);\r
 default: T_DEFAULT value {\r
     ASN_LOG_DEBUG("default: with value");\r
     $$ = new asn1::node::marker_type(asn1::node::marker_type::FL_DEFAULT);\r
-    aeb::intrusive_ptr<asn1::value> p($2->value());\r
-    $$->m_value1 = p; \r
+    asn1::valuetype *vt= dynamic_cast<asn1::valuetype *>($2);\r
+    if (vt )\r
+    { \r
+      aeb::intrusive_ptr<asn1::value> p(vt->value());\r
+      $$->m_value1 = p;\r
+    }else \r
+    {\r
+      asn1::object_identifier *oid = $2->as_object_identifier();\r
+      ASN_LOG_ERROR("default: with value BUG value is an oid");\r
+    } \r
   }\r
 \r
 ;\r
   }\r
 \r
 ;\r
@@ -2527,33 +2539,36 @@ value_assignment:
                          , $1->name().c_str());\r
          asn1::node *i = new asn1::node("CONST STRING",asn1::meta::VALUE);\r
          i->type_id(asn1::type::ASN1_STRING);\r
                          , $1->name().c_str());\r
          asn1::node *i = new asn1::node("CONST STRING",asn1::meta::VALUE);\r
          i->type_id(asn1::type::ASN1_STRING);\r
-         $$ = new asn1::value_assignment($1->name());\r
+         asn1::value_assignment *va = new asn1::value_assignment($1->name());\r
+         $$ = va;\r
          $4->identifier($$);\r
          i->identifier($$);\r
          $$->type_node(i);\r
          $4->identifier($$);\r
          i->identifier($$);\r
          $$->type_node(i);\r
-         $$->value(new asn1::value(asn1::value::VT_STRING));\r
+         va->set_value(new asn1::value(asn1::value::VT_STRING));\r
          delete($1);\r
     }\r
     | identifier T_INTEGER T_ASSIGN value {\r
          ASN_LOG_WARNING("value_assignment : ident %s type INTEGER value=%s TO BE FINALIZED",$1->name().c_str(),$4->name().c_str());\r
          asn1::node *i = $4;\r
          delete($1);\r
     }\r
     | identifier T_INTEGER T_ASSIGN value {\r
          ASN_LOG_WARNING("value_assignment : ident %s type INTEGER value=%s TO BE FINALIZED",$1->name().c_str(),$4->name().c_str());\r
          asn1::node *i = $4;\r
-         $$ = new asn1::value_assignment($1->name());\r
+         asn1::value_assignment *va = new asn1::value_assignment($1->name());\r
+         $$ = va;\r
          i->identifier($$);\r
          $$->type_node(i); //TODO remove\r
          $$->meta_id(asn1::meta::VALUE);\r
          i->identifier($$);\r
          $$->type_node(i); //TODO remove\r
          $$->meta_id(asn1::meta::VALUE);\r
-         $$->value($4->value());\r
+         va->set_value(dynamic_cast<asn1::valuetype *>($4)->value());\r
          delete($1);\r
     }\r
     | identifier T_TYPEREFERENCE T_ASSIGN value {\r
          ASN_LOG_WARNING("value_assignment : ident %s type=%s value=%s TO BE FINALIZED",$1->name().c_str(),$2->name().c_str(),$4->name().c_str());\r
          asn1::node *tr = new asn1::typeref( new asn1::simple_reference($2->name()));\r
          delete($2); \r
          delete($1);\r
     }\r
     | identifier T_TYPEREFERENCE T_ASSIGN value {\r
          ASN_LOG_WARNING("value_assignment : ident %s type=%s value=%s TO BE FINALIZED",$1->name().c_str(),$2->name().c_str(),$4->name().c_str());\r
          asn1::node *tr = new asn1::typeref( new asn1::simple_reference($2->name()));\r
          delete($2); \r
-         $$ = new asn1::value_assignment($1->name());\r
+         asn1::value_assignment *va =  new asn1::value_assignment($1->name());\r
+         $$ = va;\r
          tr->identifier($$);\r
          $$->type_node(tr);\r
          if ($4->meta_id()() == asn1::meta::VALUE) \r
          {\r
          tr->identifier($$);\r
          $$->type_node(tr);\r
          if ($4->meta_id()() == asn1::meta::VALUE) \r
          {\r
-           $$->value($4->value());\r
+           va->set_value(dynamic_cast<asn1::valuetype *>($4)->value());\r
          }\r
          delete($1);\r
     }\r
          }\r
          delete($1);\r
     }\r
@@ -2562,14 +2577,15 @@ value_assignment:
          ASN_LOG_WARNING("value_assignment : N ident %s type=%s value=%s TO BE FINALIZED",$1->name().c_str(),$2->name().c_str(),$5->name().c_str());\r
          asn1::node *tr = new asn1::typeref( new asn1::simple_reference($2->name()));\r
          delete($2); \r
          ASN_LOG_WARNING("value_assignment : N ident %s type=%s value=%s TO BE FINALIZED",$1->name().c_str(),$2->name().c_str(),$5->name().c_str());\r
          asn1::node *tr = new asn1::typeref( new asn1::simple_reference($2->name()));\r
          delete($2); \r
-         $$ = new asn1::value_assignment($1->name());\r
+         asn1::value_assignment *va = new asn1::value_assignment($1->name());\r
+         $$ = va;\r
          tr->identifier($$);\r
          tr->meta_id(asn1::meta::TYPEREF);\r
          tr->type_id(asn1::type::ASN1_REFERENCE);\r
          $$->type_node(tr);\r
          if ($5->meta_id()() == asn1::meta::VALUE) \r
          {\r
          tr->identifier($$);\r
          tr->meta_id(asn1::meta::TYPEREF);\r
          tr->type_id(asn1::type::ASN1_REFERENCE);\r
          $$->type_node(tr);\r
          if ($5->meta_id()() == asn1::meta::VALUE) \r
          {\r
-           $$->value($5->value());\r
+           va->set_value(dynamic_cast<asn1::valuetype *>($5)->value());\r
          }\r
          delete($1);\r
     }\r
          }\r
          delete($1);\r
     }\r
@@ -2622,10 +2638,10 @@ value: builtin_value {
   | defined_value\r
   {\r
     ASN_LOG_DEBUG("value: defined_value : %s",$<node>1->name().c_str());\r
   | defined_value\r
   {\r
     ASN_LOG_DEBUG("value: defined_value : %s",$<node>1->name().c_str());\r
+    $$ = $1;\r
     $$->meta_id(asn1::meta::VALUE);\r
     asn1::value *v = new asn1::value($1->name());\r
     $$->meta_id(asn1::meta::VALUE);\r
     asn1::value *v = new asn1::value($1->name());\r
-    $$->value(v);\r
-    $$ = $1;\r
+    dynamic_cast<asn1::valuetype *>($$)->value(v);\r
   }\r
   | value_from_object {\r
     ASN_LOG_DEBUG("value: value_from_object   ..");\r
   }\r
   | value_from_object {\r
     ASN_LOG_DEBUG("value: value_from_object   ..");\r
@@ -3305,6 +3321,9 @@ snmp_assignment: snmp_module_identity
   | snmp_object_identity {\r
     ASN_LOG_DEBUG("snmp_object_identity :");\r
     $$ = new asn1::mib_object_identity_assignment($<node>1->name()); \r
   | snmp_object_identity {\r
     ASN_LOG_DEBUG("snmp_object_identity :");\r
     $$ = new asn1::mib_object_identity_assignment($<node>1->name()); \r
+  } \r
+  | snmp_macro {\r
+    $$ = new asn1::mib_object_identity_assignment($<node>1->name()); \r
   }\r
 ;\r
 \r
   }\r
 ;\r
 \r
@@ -3468,9 +3487,11 @@ snmp_ot_reference: /**/
 ;\r
 \r
 snmp_ot_defval: /*NULL */\r
 ;\r
 \r
 snmp_ot_defval: /*NULL */\r
-  | T_DEFVAL T_LBRACET T_IDENTIFIER T_RBRACET {\r
+  | T_DEFVAL T_LBRACET value T_RBRACET {\r
+    ASN_LOG_DEBUG("snmp_ot_defval: TODO");\r
   }\r
   }\r
-  | T_DEFVAL T_LBRACET T_NUM T_RBRACET {\r
+  | T_DEFVAL T_LBRACET T_QUOTED_STRING  T_RBRACET {\r
+    ASN_LOG_DEBUG("snmp_ot_defval: TODO");\r
   }\r
 ;\r
 \r
   }\r
 ;\r
 \r
@@ -3665,6 +3686,34 @@ snmp_syntax: complex_type_reference opt_constraint_def
   | builtin_type opt_constraint_def\r
   | T_BITS T_LBRACET constant_list T_RBRACET \r
 ;\r
   | builtin_type opt_constraint_def\r
   | T_BITS T_LBRACET constant_list T_RBRACET \r
 ;\r
+snmp_macro:  T_MACRO_NAME T_MACRO T_END {\r
+      ASN_LOG_DEBUG("snmp smi MACRO to be ignored:");\r
+    }\r
+    | T_MACRO_OBJECT_IDENTITY T_MACRO T_END {\r
+      ASN_LOG_DEBUG("snmp smi MACRO to be ignored:");\r
+    }\r
+    | T_MACRO_OBJECT_TYPE T_MACRO T_END {\r
+      ASN_LOG_DEBUG("snmp smi MACRO to be ignored:");\r
+    }\r
+    | T_MACRO_NOTIFICATION_TYPE T_MACRO T_END {\r
+      ASN_LOG_DEBUG("snmp smi MACRO to be ignored:");\r
+    }\r
+    | T_MACRO_TRAP_TYPE T_MACRO T_END {\r
+      ASN_LOG_DEBUG("snmp smi MACRO to be ignored:");\r
+    }\r
+    | T_MACRO_TC T_MACRO T_END {\r
+      ASN_LOG_DEBUG("snmp smi MACRO to be ignored:");\r
+    }\r
+    | T_MACRO_OBJECT_GROUP T_MACRO T_END {\r
+      ASN_LOG_DEBUG("snmp smi MACRO to be ignored:");\r
+    }\r
+    | T_MACRO_NOTIFICATION_GROUP T_MACRO T_END {\r
+      ASN_LOG_DEBUG("snmp smi MACRO to be ignored:");\r
+    }\r
+    | T_MACRO_MODULE_COMPLIANCE T_MACRO T_END {\r
+      ASN_LOG_DEBUG("snmp smi MACRO to be ignored:");\r
+    }\r
+;\r
 \r
 /*\r
  *\r
 \r
 /*\r
  *\r