As preparation, need to get all dependent MIB files:
- RFC1155-SMI.mib (Extract from rfc, section 6 - Definitions)
- RFC-1212.mib (Extract from rfc, section 4 - Defining Objects, need to complete it manually)
- RFC1158-MIB.mib (Extract from rfc, section 6 - Definitions) - This is dependent for RFC-1212 on "DisplayString" definition only. This is obsoleted by RFC1213.
Open each files in Xtext Editor, make sure MIB grammar able to handle them.
RFC1155-SMI.mib
Following format is not supported:
| RFC1155-SMI.mib |
|---|
internet OBJECT IDENTIFIER ::= { iso org(3) dod(6) 1 }
|
Therefore, modify the file to following
| RFC1155-SMI.mib |
|---|
-- internet OBJECT IDENTIFIER ::= { iso org(3) dod(6) 1 }
iso OBJECT IDENTIFIER ::= { 0 }
org OBJECT IDENTIFIER ::= { iso 3 }
dod OBJECT IDENTIFIER ::= { org 6 }
internet OBJECT IDENTIFIER ::= { dod 1 }
|
"iso" is the root most, so make an exception for it.
| Mib.xtext |
|---|
OidValue:
// '::=' '{' parent=[Object] oidnum=INT '}';
'::=' '{' parent=[Object]? oidnum=INT '}';
|
After this, error there will be :
This file also contains a new type called MACRO.
| RFC1155-SMI.mib |
|---|
OBJECT-TYPE MACRO ::= BEGIN
TYPE NOTATION ::= "SYNTAX" type (TYPE ObjectSyntax)
"ACCESS" Access
"STATUS" Status
VALUE NOTATION ::= value (VALUE ObjectName)
Access ::= "read-only"
| "read-write"
| "write-only"
| "not-accessible"
Status ::= "mandatory"
| "optional"
| "obsolete"
END
|
In order to support Macro, modify as follow:
| Mib.xtext |
|---|
Macro:
name=ID 'MACRO' '::=' 'BEGIN'
(ID 'NOTATION' '::=' MacroType+)+
(ID '::=' (MacroList | MacroType | MacroCompound | MacroEnum) ('|' MacroType)?)*
'END';
MacroList:
ID '|' ID '","' ID;
MacroCompound:
STRING? '"{"' MacroType '"}"';
MacroType:
STRING? ID ('(' ID? mibType ')')?;
MacroEnum:
STRING ('|' STRING)*;
|
RFC-1212.mib
Should display without any error.
Therefore the final Mib.xtext should look something like:
| Mib.xtext |
|---|
grammar com.ravi.mib.xtext.Mib hidden(WS, ML_COMMENT, SL_COMMENT)
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
generate mib "http://www.ravi.com/mib/xtext/Mib"
MibModel:
definitions+=Definition*;
Definition:
name=ID 'DEFINITIONS' '::=' 'BEGIN'
Export?
imports=Import?
(identifiers+=Identifier | DataType | macros+=Macro)+
'END';
Import:
'IMPORTS' defs+=ImpDef+ ';';
ImpDef:
objects+=MibObject (',' objects+=MibObject)* 'FROM' defname=ID;
MibObject:
name=ID;
Export:
'EXPORTS' ID (',' ID)* ';';
Identifier:
ObjectType | (name=MibObject mibType value=OidValue);
ObjectType:
name=MibObject imp=[MibObject] 'SYNTAX' mibType 'ACCESS' ID 'STATUS' ID
('DESCRIPTION' STRING)?
('REFERENCE' STRING)?
('INDEX' '{' mibType (',' mibType)* '}')?
('DEFVAL' '{' INT | STRING '}')?
value=OidValue;
OidValue:
'::=' '{' parent=[MibObject]? oidnum=INT '}';
DataType:
ID '::=' ('[' 'APPLICATION' INT ']')? 'IMPLICIT'? (Choice | Sequence | mibType);
Choice:
'CHOICE' '{' ID mibType (',' ID mibType)* '}';
Sequence:
'SEQUENCE' '{' ID mibType (',' ID mibType)* '}';
mibType:
('SEQUENCE' 'OF')?
('OCTET' 'STRING' | ID | 'INTEGER' | 'OBJECT' 'IDENTIFIER')
('(' 'SIZE' '(' (INT '..')? INT ')' ')')?
('(' (INT '..')? (INT | 'MAX') ')')?
('{' ID '(' INT ')' (',' ID '(' INT ')')* '}')?;
Macro:
name=ID 'MACRO' '::=' 'BEGIN'
// TYPE NOTATION vs VALUE NOTATION
(ID 'NOTATION' '::=' MacroType+)+
(ID '::=' (MacroList | MacroType | MacroCompound | MacroEnum) ('|' MacroType)?)*
'END';
MacroList:
ID '|' ID '","' ID;
MacroCompound:
STRING? '"{"' MacroType '"}"';
MacroType:
STRING? ID ('(' ID? mibType ')')?;
MacroEnum:
STRING ('|' STRING)*;
/*
* -------------------------------------------------------------
* Unfortunately need to overwrite following lexers
* -------------------------------------------------------------
*/
terminal ID:
'^'? ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '-' | '0'..'9')*;
terminal INT returns ecore::EInt:
('0'..'9')+;
terminal STRING:
'"' ('\\' ('b' | 't' | 'n' | 'f' | 'r' | 'u' | '"' | "'" | '\\') | !('\\' | '"'))* '"' |
"'" ('\\' ('b' | 't' | 'n' | 'f' | 'r' | 'u' | '"' | "'" | '\\') | !('\\' | "'"))* "'";
terminal ML_COMMENT:
'/*'->'*/';
terminal SL_COMMENT:
'--' !('\n' | '\r')* ('\r'? '\n')?;
terminal WS:
(' ' | '\t' | '\r' | '\n')+;
terminal ANY_OTHER:
.;
|
1) Support OidValue with multiple definition "{ iso org(3) dod(6) 1 }"

No comments:
Post a Comment