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) {};
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
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
--- /dev/null
+#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
})
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 */
<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)
<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();
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);
\r
%}\r
\r
+%right T_ASSIGN\r
+\r
%token T_ABSENT\r
%token T_ABSTRACT\r
%token T_ABSTRACT_SYNTAX\r
$<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
$$->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
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
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
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
}\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
};\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
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
}\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
\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
\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
$<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
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
asn1p->files().pop_back();
return 0;
} else {
+ std::cout<<"Not Found File : "<<fullname<<std::endl;
return 1;
}
} else
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
{
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()
{
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")