%% /* * Yacc rules. * */ /* * One mibFile may contain multiple MIB modules. * It's also possible that there's no module in a file. */ mibFile: modules | /* empty */ ; modules: module | modules module ; /* * The general structure of a module is described at REF:RFC1902,3. . * An example is given at REF:RFC1902,5.7. . */ module: moduleName DEFINITIONS COLON_COLON_EQUAL BEGIN_ exportsClause linkagePart declarationPart END ; /* * REF:RFC1902,3.2. */ linkagePart: linkageClause | /* empty */ ; linkageClause: IMPORTS importPart ';' ; exportsClause: /* empty */ | EXPORTS /* the scanner skips until... */ ';' ; importPart: imports | /* empty */ /* TODO: ``IMPORTS ;'' allowed? refer ASN.1! */ ; imports: import | imports import ; import: importIdentifiers FROM moduleName /* TODO: multiple clauses with same moduleName * allowed? I guess so. refer ASN.1! */ ; importIdentifiers: importIdentifier | importIdentifiers ',' importIdentifier /* TODO: might this list list be empty? */ ; /* * Note that some named types must not be imported, REF:RFC1902,590 . */ importIdentifier: LOWERCASE_IDENTIFIER | UPPERCASE_IDENTIFIER | importedKeyword /* TODO: what exactly is allowed here? * What should be checked? */ ; /* * These keywords are no real keywords. They have to be imported * from the SMI, TC, CONF MIBs. */ /* * TODO: Think! Shall we really leave these words as keywords or should * we prefer the symbol table appropriately?? */ importedKeyword: ACCESS | AGENT_CAPABILITIES | AUGMENTS | BITS | CONTACT_INFO | CREATION_REQUIRES | COUNTER32 | COUNTER64 | DEFVAL | DESCRIPTION | DISPLAY_HINT | GROUP | GAUGE32 | IMPLIED | INDEX | INTEGER32 | IPADDRESS | LAST_UPDATED | MANDATORY_GROUPS | MAX_ACCESS | MIN_ACCESS | MODULE | MODULE_COMPLIANCE | MODULE_IDENTITY | NOTIFICATIONS | NOTIFICATION_GROUP | NOTIFICATION_TYPE | OBJECT_GROUP | OBJECT_IDENTITY | OBJECT_TYPE | OBJECTS | ORGANIZATION | OPAQUE | PRODUCT_RELEASE | REFERENCE | REVISION | STATUS | SUPPORTS | SYNTAX | TEXTUAL_CONVENTION | TIMETICKS | TRAP_TYPE | UNITS | UNSIGNED32 | VARIATION | WRITE_SYNTAX /* TODO: which keywords should really be * allowed in import clauses? */ ; moduleName: UPPERCASE_IDENTIFIER ; /* * The paragraph at REF:RFC1902,490 lists roughly what's allowed * in the body of an information module. */ declarationPart: declarations | /* empty */ /* TODO: might this list really be emtpy? */ ; declarations: declaration | declarations declaration ; declaration: typeDeclaration | valueDeclaration | objectIdentityClause | objectTypeClause | trapTypeClause | notificationTypeClause | moduleIdentityClause /* TODO: check it's first and once */ | moduleComplianceClause | objectGroupClause | notificationGroupClause | macroClause | error '}' ; /* * Macro clauses. Its contents are not really parsed, but skipped by * the scanner until 'END' is read. This is just to make the SMI * documents readable. */ macroClause: macroName MACRO /* the scanner skips until... */ END ; macroName: MODULE_IDENTITY | OBJECT_TYPE | TRAP_TYPE | NOTIFICATION_TYPE | OBJECT_IDENTITY | TEXTUAL_CONVENTION | OBJECT_GROUP | NOTIFICATION_GROUP | MODULE_COMPLIANCE | AGENT_CAPABILITIES ; choiceClause: CHOICE /* the scanner skips until... */ '}' ; /* * The only ASN.1 value declarations are for OIDs, REF:RFC1902,491 . */ valueDeclaration: LOWERCASE_IDENTIFIER OBJECT IDENTIFIER COLON_COLON_EQUAL '{' objectIdentifier '}' ; /* * This is for simple ASN.1 style type assignments and textual conventions. */ typeDeclaration: typeName COLON_COLON_EQUAL typeDeclarationRHS ; typeName: UPPERCASE_IDENTIFIER | typeSMI ; typeSMI: INTEGER32 | IPADDRESS | COUNTER32 | GAUGE32 | UNSIGNED32 | TIMETICKS | OPAQUE | COUNTER64 ; typeDeclarationRHS: Syntax | TEXTUAL_CONVENTION DisplayPart STATUS Status DESCRIPTION Text ReferPart SYNTAX Syntax | choiceClause ; /* REF:RFC1902,7.1.12. */ conceptualTable: SEQUENCE OF row ; row: UPPERCASE_IDENTIFIER /* * In this case, we do NOT allow `Module.Type'. * The identifier must be defined in the local * module. */ /* TODO: this must be an entryType */ ; /* REF:RFC1902,7.1.12. */ entryType: SEQUENCE '{' sequenceItems '}' ; sequenceItems: sequenceItem | sequenceItems ',' sequenceItem /* TODO: might this list be emtpy? */ ; /* * In a SEQUENCE { ... } there are no sub-types, enumerations or * named bits. REF: draft, p.29 * NOTE: REF:RFC1902,7.1.12. was less clear, it said: * `normally omitting the sub-typing information' */ sequenceItem: LOWERCASE_IDENTIFIER sequenceSyntax ; Syntax: ObjectSyntax | BITS '{' NamedBits '}' /* TODO: standalone `BITS' ok? seen in RMON2-MIB */ /* -> no, it's only allowed in a SEQUENCE {...} */ ; sequenceSyntax: /* ObjectSyntax */ sequenceObjectSyntax | BITS | UPPERCASE_IDENTIFIER anySubType ; NamedBits: NamedBit | NamedBits ',' NamedBit ; NamedBit: identifier '(' number ')' ; identifier: LOWERCASE_IDENTIFIER /* TODO */ ; objectIdentityClause: LOWERCASE_IDENTIFIER OBJECT_IDENTITY STATUS Status DESCRIPTION Text ReferPart COLON_COLON_EQUAL '{' objectIdentifier '}' ; objectTypeClause: LOWERCASE_IDENTIFIER OBJECT_TYPE SYNTAX Syntax UnitsPart MaxAccessPart STATUS Status descriptionClause ReferPart IndexPart DefValPart COLON_COLON_EQUAL '{' ObjectName '}' ; descriptionClause: /* empty */ | DESCRIPTION Text ; trapTypeClause: LOWERCASE_IDENTIFIER TRAP_TYPE ENTERPRISE objectIdentifier VarPart DescrPart ReferPart COLON_COLON_EQUAL number /* TODO: range of number? */ ; VarPart: VARIABLES '{' VarTypes '}' | /* empty */ ; VarTypes: VarType | VarTypes ',' VarType ; VarType: ObjectName ; DescrPart: DESCRIPTION Text | /* empty */ ; MaxAccessPart: MAX_ACCESS Access | ACCESS Access /* TODO: limited values in v1 */ ; notificationTypeClause: LOWERCASE_IDENTIFIER NOTIFICATION_TYPE ObjectsPart STATUS Status DESCRIPTION Text ReferPart COLON_COLON_EQUAL '{' NotificationName '}' ; moduleIdentityClause: LOWERCASE_IDENTIFIER MODULE_IDENTITY LAST_UPDATED ExtUTCTime ORGANIZATION Text CONTACT_INFO Text DESCRIPTION Text RevisionPart COLON_COLON_EQUAL '{' objectIdentifier '}' ; ObjectSyntax: SimpleSyntax | typeTag SimpleSyntax | conceptualTable /* TODO: possible? row? entry? */ | row /* the uppercase name of a row */ | entryType /* SEQUENCE { ... } phrase */ | ApplicationSyntax ; typeTag: '[' APPLICATION number ']' IMPLICIT | '[' UNIVERSAL number ']' IMPLICIT ; /* * In a SEQUENCE { ... } there are no sub-types, enumerations or * named bits. REF: draft, p.29 */ sequenceObjectSyntax: sequenceSimpleSyntax /* | conceptualTable /* TODO: possible? row? entry? */ /* | row /* the uppercase name of a row */ /* | entryType /* it's SEQUENCE { ... } phrase */ | sequenceApplicationSyntax ; /* TODO: specify really according to ObjectSyntax!!! */ valueofObjectSyntax: valueofSimpleSyntax /* conceptualTables and rows do not have DEFVALs */ /* valueofApplicationSyntax would not introduce any * further syntax of ObjectSyntax values. */ ; SimpleSyntax: INTEGER /* (-2147483648..2147483647) */ | INTEGER integerSubType | INTEGER enumSpec | INTEGER32 /* (-2147483648..2147483647) */ | INTEGER32 integerSubType | UPPERCASE_IDENTIFIER enumSpec | moduleName '.' UPPERCASE_IDENTIFIER enumSpec /* TODO: UPPERCASE_IDENTIFIER must be an INTEGER */ | UPPERCASE_IDENTIFIER integerSubType | moduleName '.' UPPERCASE_IDENTIFIER integerSubType /* TODO: UPPERCASE_IDENTIFIER must be an INT/Int32. */ | OCTET STRING /* (SIZE (0..65535)) */ | OCTET STRING octetStringSubType | UPPERCASE_IDENTIFIER octetStringSubType | moduleName '.' UPPERCASE_IDENTIFIER octetStringSubType /* TODO: UPPERCASE_IDENTIFIER must be an OCTET STR. */ | OBJECT IDENTIFIER ; valueofSimpleSyntax: number /* 0..2147483647 */ /* NOTE: Counter64 must not have a DEFVAL */ | '-' number /* -2147483648..0 */ | BIN_STRING /* number or OCTET STRING */ | HEX_STRING /* number or OCTET STRING */ | LOWERCASE_IDENTIFIER /* enumeration or named oid */ | QUOTED_STRING /* an OCTET STRING */ /* NOTE: If the value is an OBJECT IDENTIFIER, then * it must be expressed as a single ASN.1 * identifier, and not as a collection of * of sub-identifiers. * REF: draft,p.34 * Anyway, we try to accept it. But it's only * possible for numbered sub-identifiers, since * other identifiers would make something like * { gaga } indistiguishable from a BitsValue. */ | '{' objectIdentifier_defval '}' /* * This is only for some MIBs with invalid numerical * OID notation for DEFVALs. We DO NOT parse them * correctly. We just don't want to produce a * parser error. */ ; /* * In a SEQUENCE { ... } there are no sub-types, enumerations or * named bits. REF: draft, p.29 */ sequenceSimpleSyntax: INTEGER anySubType /* (-2147483648..2147483647) */ | INTEGER32 anySubType /* (-2147483648..2147483647) */ | OCTET STRING anySubType | OBJECT IDENTIFIER ; ApplicationSyntax: IPADDRESS | COUNTER32 /* (0..4294967295) */ | GAUGE32 /* (0..4294967295) */ | GAUGE32 integerSubType | UNSIGNED32 /* (0..4294967295) */ | UNSIGNED32 integerSubType | TIMETICKS /* (0..4294967295) */ | OPAQUE /* IMPLICIT OCTET STRING */ | COUNTER64 /* (0..18446744073709551615) */ ; /* * In a SEQUENCE { ... } there are no sub-types, enumerations or * named bits. REF: draft, p.29 */ sequenceApplicationSyntax: IPADDRESS | COUNTER32 /* (0..4294967295) */ | GAUGE32 anySubType /* (0..4294967295) */ | UNSIGNED32 anySubType /* (0..4294967295) */ | TIMETICKS /* (0..4294967295) */ | OPAQUE /* IMPLICIT OCTET STRING */ | COUNTER64 /* (0..18446744073709551615) */ ; anySubType: integerSubType | octetStringSubType | enumSpec | /* empty */ ; /* REF: draft,p.46 */ integerSubType: '(' ranges ')' /* at least one range */ /* * the specification mentions an alternative of an * empty RHS here. this would lead to reduce/reduce * conflicts. instead, we differentiate the parent * rule(s) (SimpleSyntax). */ ; octetStringSubType: '(' SIZE '(' ranges ')' ')' /* * the specification mentions an alternative of an * empty RHS here. this would lead to reduce/reduce * conflicts. instead, we differentiate the parent * rule(s) (SimpleSyntax). */ ; ranges: range | ranges '|' range ; range: value | value DOT_DOT value ; value: '-' number | number | HEX_STRING | BIN_STRING ; enumSpec: '{' enumItems '}' ; enumItems: enumItem | enumItems ',' enumItem ; enumItem: LOWERCASE_IDENTIFIER '(' enumNumber ')' ; enumNumber: number | '-' number ; Status: LOWERCASE_IDENTIFIER ; Status_Capabilities: LOWERCASE_IDENTIFIER ; DisplayPart: DISPLAY_HINT Text | /* empty */ ; UnitsPart: UNITS Text | /* empty */ ; Access: LOWERCASE_IDENTIFIER ; IndexPart: INDEX '{' IndexTypes '}' | AUGMENTS '{' Entry '}' /* TODO: no AUGMENTS clause in v1 */ /* TODO: how to differ INDEX and AUGMENTS ? */ | /* empty */ ; IndexTypes: IndexType | IndexTypes ',' IndexType /* TODO: might this list be emtpy? */ ; IndexType: IMPLIED Index | Index ; Index: ObjectName /* * TODO: use the SYNTAX value of the correspondent * OBJECT-TYPE invocation */ ; Entry: ObjectName ; DefValPart: DEFVAL '{' Value '}' | /* empty */ /* TODO: different for DefValPart in AgentCaps ? */ ; Value: valueofObjectSyntax | '{' BitsValue '}' ; BitsValue: BitNames | /* empty */ ; BitNames: BitName | BitNames ',' BitName ; BitName: identifier ; ObjectName: objectIdentifier ; NotificationName: objectIdentifier ; ReferPart: REFERENCE Text | /* empty */ ; RevisionPart: Revisions | /* empty */ ; Revisions: Revision | Revisions Revision ; Revision: REVISION ExtUTCTime DESCRIPTION Text ; ObjectsPart: OBJECTS '{' Objects '}' | /* empty */ ; Objects: Object | Objects ',' Object ; Object: ObjectName ; NotificationsPart: NOTIFICATIONS '{' Notifications '}' ; Notifications: Notification | Notifications ',' Notification ; Notification: NotificationName ; Text: QUOTED_STRING ; /* * TODO: REF: */ ExtUTCTime: QUOTED_STRING ; objectIdentifier: subidentifiers ; subidentifiers: subidentifier | subidentifiers subidentifier ; subidentifier: LOWERCASE_IDENTIFIER | moduleName '.' LOWERCASE_IDENTIFIER | number | LOWERCASE_IDENTIFIER '(' number ')' | moduleName '.' LOWERCASE_IDENTIFIER '(' number ')' ; objectIdentifier_defval: subidentifiers_defval ; /* TODO: right? */ subidentifiers_defval: subidentifier_defval | subidentifiers_defval subidentifier_defval ; /* TODO: right? */ subidentifier_defval: LOWERCASE_IDENTIFIER '(' number ')' | number ; /* TODO: right? range? */ objectGroupClause: LOWERCASE_IDENTIFIER OBJECT_GROUP ObjectsPart STATUS Status DESCRIPTION Text ReferPart COLON_COLON_EQUAL '{' objectIdentifier '}' ; notificationGroupClause: LOWERCASE_IDENTIFIER NOTIFICATION_GROUP NotificationsPart STATUS Status DESCRIPTION Text ReferPart COLON_COLON_EQUAL '{' objectIdentifier '}' ; moduleComplianceClause: LOWERCASE_IDENTIFIER MODULE_COMPLIANCE STATUS Status DESCRIPTION Text ReferPart ComplianceModulePart COLON_COLON_EQUAL '{' objectIdentifier '}' ; ComplianceModulePart: ComplianceModules ; ComplianceModules: ComplianceModule | ComplianceModules ComplianceModule ; ComplianceModule: MODULE ComplianceModuleName MandatoryPart CompliancePart ; ComplianceModuleName: UPPERCASE_IDENTIFIER objectIdentifier | UPPERCASE_IDENTIFIER | /* empty, only if contained in MIB module */ /* TODO: RFC 1904 looks a bit different, is this ok? */ ; MandatoryPart: MANDATORY_GROUPS '{' MandatoryGroups '}' | /* empty */ ; MandatoryGroups: MandatoryGroup | MandatoryGroups ',' MandatoryGroup ; MandatoryGroup: objectIdentifier ; CompliancePart: Compliances | /* empty */ ; Compliances: Compliance | Compliances Compliance ; Compliance: ComplianceGroup | ComplianceObject ; ComplianceGroup: GROUP objectIdentifier DESCRIPTION Text ; ComplianceObject: OBJECT ObjectName SyntaxPart WriteSyntaxPart AccessPart DESCRIPTION Text ; SyntaxPart: SYNTAX Syntax | /* empty */ ; WriteSyntaxPart: WRITE_SYNTAX WriteSyntax | /* empty */ ; WriteSyntax: Syntax ; AccessPart: MIN_ACCESS Access | /* empty */ ; agentCapabilitiesClause: LOWERCASE_IDENTIFIER AGENT_CAPABILITIES PRODUCT_RELEASE Text STATUS Status_Capabilities DESCRIPTION Text ReferPart ModulePart_Capabilities COLON_COLON_EQUAL '{' objectIdentifier '}' ; ModulePart_Capabilities: Modules_Capabilities | /* empty */ ; Modules_Capabilities: Module_Capabilities | Modules_Capabilities Module_Capabilities ; Module_Capabilities: SUPPORTS ModuleName_Capabilities /* TODO: example in the SimpleBook names the module * while the given syntax provides oids ?! */ INCLUDES '{' CapabilitiesGroups '}' VariationPart ; CapabilitiesGroups: CapabilitiesGroup | CapabilitiesGroups ',' CapabilitiesGroup ; CapabilitiesGroup: objectIdentifier ; ModuleName_Capabilities: objectIdentifier | UPPERCASE_IDENTIFIER | /* empty */ /* empty, only if contained in MIB module */ /* TODO: ?? */ ; VariationPart: Variations | /* empty */ ; Variations: Variation | Variations Variation ; Variation: ObjectVariation | NotificationVariation ; NotificationVariation: VARIATION ObjectName AccessPart DESCRIPTION Text ; ObjectVariation: VARIATION ObjectName SyntaxPart WriteSyntaxPart AccessPart CreationPart DefValPart DESCRIPTION Text ; CreationPart: CREATION_REQUIRES '{' Cells '}' | /* empty */ ; Cells: Cell | Cells ',' Cell ; Cell: ObjectName ; number: NUMBER ; %%