asn_grammar.y
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:48k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. %expect 14
  2. %{
  3. /*
  4.  * asn_grammar.y
  5.  *
  6.  * ASN grammar file
  7.  *
  8.  * ASN.1 compiler to produce C++ classes.
  9.  *
  10.  * Copyright (c) 1997-1999 Equivalence Pty. Ltd.
  11.  *
  12.  * The contents of this file are subject to the Mozilla Public License
  13.  * Version 1.0 (the "License"); you may not use this file except in
  14.  * compliance with the License. You may obtain a copy of the License at
  15.  * http://www.mozilla.org/MPL/
  16.  *
  17.  * Software distributed under the License is distributed on an "AS IS"
  18.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  19.  * the License for the specific language governing rights and limitations
  20.  * under the License.
  21.  *
  22.  * The Original Code is ASN Parser.
  23.  *
  24.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  25.  *
  26.  * Portions of this code were written with the assisance of funding from
  27.  * Vovida Networks, Inc. http://www.vovida.com.
  28.  *
  29.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  30.  * All Rights Reserved.
  31.  *
  32.  * Contributor(s): ______________________________________.
  33.  *
  34.  * $Log: asn_grammar.y,v $
  35.  * Revision 1.10  2000/05/08 08:55:44  robertj
  36.  * Fixed production error for ValueSet, thanks Huang-Ming Huang
  37.  *
  38.  * Revision 1.9  2000/01/19 12:33:07  robertj
  39.  * Fixed parsing of OID's in IMPORTS section.
  40.  *
  41.  * Revision 1.8  2000/01/19 03:38:12  robertj
  42.  * Fixed support for parsing multiple IMPORTS
  43.  *
  44.  * Revision 1.7  1999/07/22 06:48:54  robertj
  45.  * Added comparison operation to base ASN classes and compiled ASN code.
  46.  * Added support for ANY type in ASN parser.
  47.  *
  48.  * Revision 1.6  1999/06/09 06:58:08  robertj
  49.  * Adjusted heading comments.
  50.  *
  51.  * Revision 1.5  1999/06/07 01:56:25  robertj
  52.  * Added header comment on license.
  53.  *
  54.  * Revision 1.4  1999/06/06 05:30:28  robertj
  55.  * Support for parameterised types and type-dentifier types.
  56.  * Added ability to output multiple .cxx files.
  57.  *
  58.  * Revision 1.3  1998/12/14 06:47:55  robertj
  59.  * New memory check code support.
  60.  *
  61.  * Revision 1.2  1998/05/21 04:21:46  robertj
  62.  * Implementing more of the ASN spec.
  63.  *
  64.  * Revision 1.1  1997/12/13 09:17:47  robertj
  65.  * Initial revision
  66.  *
  67.  */
  68. #include <ptlib.h>
  69. #undef malloc
  70. #undef calloc
  71. #undef realloc
  72. #undef free
  73. #include "main.h"
  74. extern int yylex();
  75. extern int ReferenceTokenContext;
  76. extern int IdentifierTokenContext;
  77. extern int BraceTokenContext;
  78. extern int NullTokenContext;
  79. extern int InMacroContext;
  80. extern int HasObjectTypeMacro;
  81. extern int InMIBContext;
  82. extern TypesList * CurrentImportList;
  83. static int UnnamedFieldCount = 1;
  84. static PStringList * DummyParameters;
  85. static PString * ConcatNames(PString * s1, char c, PString * s2)
  86. {
  87.   *s1 += c;
  88.   *s1 += *s2;
  89.   delete s2;
  90.   return s1;
  91. }
  92. #ifdef _MSC_VER
  93. #pragma warning(disable:4701)
  94. #endif
  95. %}
  96. %token IDENTIFIER
  97. %token BIT_IDENTIFIER
  98. %token OID_IDENTIFIER
  99. %token IMPORT_IDENTIFIER
  100. %token MODULEREFERENCE
  101. %token TYPEREFERENCE
  102. %token OBJECTCLASSREFERENCE
  103. %token TYPEFIELDREFERENCE
  104. %token VALUEFIELDREFERENCE
  105. %token VALUESETFIELDREFERENCE
  106. %token OBJECTFIELDREFERENCE
  107. %token OBJECTSETFIELDREFERENCE
  108. %token OBJECTREFERENCE
  109. %token OBJECTSETREFERENCE
  110. %token INTEGER
  111. %token CSTRING
  112. %token OS_BSTRING
  113. %token BS_BSTRING
  114. %token OS_HSTRING
  115. %token BS_HSTRING
  116. %token STRING_BRACE
  117. %token BITSTRING_BRACE
  118. %token OID_BRACE
  119. %token ABSENT           
  120. %token ABSTRACT_SYNTAX  
  121. %token ALL              
  122. %token ANY
  123. %token APPLICATION      
  124. %token ASSIGNMENT
  125. %token AUTOMATIC        
  126. %token BEGIN_t
  127. %token BIT              
  128. %token BMPString
  129. %token BOOLEAN_t
  130. %token BY
  131. %token CHARACTER        
  132. %token CHOICE           
  133. %token CLASS            
  134. %token COMPONENT        
  135. %token COMPONENTS       
  136. %token CONSTRAINED      
  137. %token DEFAULT          
  138. %token DEFINED
  139. %token DEFINITIONS      
  140. %token EMBEDDED         
  141. %token END
  142. %token ENUMERATED       
  143. %token EXCEPT           
  144. %token EXPLICIT         
  145. %token EXPORTS          
  146. %token EXTERNAL         
  147. %token FALSE_t           
  148. %token FROM             
  149. %token GeneralString    
  150. %token GraphicString    
  151. %token IA5String        
  152. %token TYPE_IDENTIFIER 
  153. %token IDENTIFIER_t
  154. %token IMPLICIT         
  155. %token IMPORTS          
  156. %token INCLUDES         
  157. %token INSTANCE         
  158. %token INTEGER_t        
  159. %token INTERSECTION     
  160. %token ISO646String
  161. %token MACRO
  162. %token MAX              
  163. %token MIN              
  164. %token MINUS_INFINITY
  165. %token NOTATION
  166. %token NULL_VALUE
  167. %token NULL_TYPE
  168. %token NumericString    
  169. %token OBJECT           
  170. %token OCTET            
  171. %token OF_t              
  172. %token OPTIONAL_t
  173. %token PDV              
  174. %token PLUS_INFINITY    
  175. %token PRESENT          
  176. %token PrintableString  
  177. %token PRIVATE          
  178. %token REAL             
  179. %token SEQUENCE         
  180. %token SET              
  181. %token SIZE_t            
  182. %token STRING           
  183. %token SYNTAX           
  184. %token T61String        
  185. %token TAGS             
  186. %token TeletexString    
  187. %token TRUE_t
  188. %token TYPE_t
  189. %token UNION            
  190. %token UNIQUE           
  191. %token UNIVERSAL        
  192. %token UniversalString  
  193. %token VideotexString   
  194. %token VisibleString    
  195. %token GeneralizedTime
  196. %token UTCTime
  197. %token VALUE
  198. %token WITH
  199. %token string_t
  200. %token identifier_t
  201. %token number_t
  202. %token empty_t
  203. %token type_t
  204. %token value_t
  205. %token OBJECT_TYPE
  206. %token TRAP_TYPE
  207. %token ACCESS
  208. %token STATUS
  209. %token read_only_t
  210. %token read_write_t
  211. %token write_only_t
  212. %token not_accessible_t
  213. %token mandatory_t
  214. %token optional_t
  215. %token obsolete_t
  216. %token deprecated_t
  217. %token DESCRIPTION_t
  218. %token REFERENCE_t
  219. %token INDEX_t
  220. %token DEFVAL_t
  221. %token ENTERPRISE
  222. %token VARIABLES
  223. %token ObjectDescriptor_t
  224. %type <ival> INTEGER
  225. %type <ival> TagDefault
  226. %type <ival> SignedNumber
  227. %type <ival> ObjectTypeAccess ObjectTypeStatus
  228. %type <ival> Class ClassNumber
  229. %type <ival> PresenceConstraint
  230. %type <sval> CSTRING
  231. %type <sval> BS_BSTRING
  232. %type <sval> OS_BSTRING
  233. %type <sval> BS_HSTRING
  234. %type <sval> OS_HSTRING
  235. %type <sval> IDENTIFIER
  236. %type <sval> BIT_IDENTIFIER
  237. %type <sval> OID_IDENTIFIER
  238. %type <sval> IMPORT_IDENTIFIER
  239. %type <sval> TYPEREFERENCE
  240. %type <sval> MODULEREFERENCE
  241. %type <sval> OBJECTCLASSREFERENCE
  242. %type <sval> TYPEFIELDREFERENCE
  243. %type <sval> VALUEFIELDREFERENCE
  244. %type <sval> VALUESETFIELDREFERENCE
  245. %type <sval> OBJECTFIELDREFERENCE
  246. %type <sval> OBJECTSETFIELDREFERENCE
  247. %type <sval> OBJECTREFERENCE
  248. %type <sval> OBJECTSETREFERENCE
  249. %type <sval> DefinitiveObjIdComponent
  250. %type <sval> DefinitiveNameAndNumberForm
  251. %type <sval> GlobalModuleReference
  252. %type <sval> Reference
  253. %type <sval> ExternalTypeReference ExternalValueReference
  254. %type <sval> ObjIdComponent
  255. %type <sval> NumberForm
  256. %type <sval> SimpleDefinedType
  257. %type <sval> ComponentIdList
  258. %type <sval> CharsDefn
  259. %type <sval> SimpleDefinedValue
  260. %type <sval> FieldName PrimitiveFieldName
  261. %type <sval> DefinedObjectClass
  262. %type <sval> ExternalObjectClassReference
  263. %type <sval> UsefulObjectClassReference
  264. %type <sval> Parameter
  265. %type <sval> MibIndexType MibDescrPart MibReferPart
  266. %type <slst> DefinitiveIdentifier
  267. %type <slst> DefinitiveObjIdComponentList
  268. %type <slst> ObjIdComponentList
  269. %type <slst> BitIdentifierList
  270. %type <slst> CharSyms
  271. %type <slst> ParameterList Parameters
  272. %type <slst> MibIndexTypes MibIndexPart
  273. %type <tval> Type BuiltinType ReferencedType NamedType
  274. %type <tval> DefinedType
  275. %type <tval> ConstrainedType
  276. %type <tval> TypeWithConstraint
  277. %type <tval> BitStringType
  278. %type <tval> BooleanType
  279. %type <tval> CharacterStringType 
  280. %type <tval> RestrictedCharacterStringType
  281. %type <tval> UnrestrictedCharacterStringType
  282. %type <tval> ChoiceType AlternativeTypeLists
  283. %type <tval> EmbeddedPDVType
  284. %type <tval> EnumeratedType Enumerations
  285. %type <tval> ExternalType
  286. %type <tval> AnyType
  287. %type <tval> IntegerType
  288. %type <tval> NullType
  289. %type <tval> ObjectClassFieldType
  290. %type <tval> ObjectIdentifierType
  291. %type <tval> OctetStringType 
  292. %type <tval> RealType
  293. %type <tval> SequenceType ComponentType ComponentTypeLists
  294. %type <tval> SequenceOfType
  295. %type <tval> SetType
  296. %type <tval> SetOfType
  297. %type <tval> TaggedType
  298. %type <tval> ParameterizedType
  299. %type <tval> SelectionType
  300. %type <tval> UsefulType
  301. %type <tval> TypeFromObject
  302. %type <tval> ContainedSubtype
  303. %type <tval> ActualParameter
  304. %type <tval> UserDefinedConstraintParameter
  305. %type <tval> Symbol
  306. %type <tval> ParameterizedReference
  307. %type <tlst> AlternativeTypeList
  308. %type <tlst> ComponentTypeList
  309. %type <tlst> ActualParameterList ActualParameters
  310. %type <tlst> UserDefinedConstraintParameters
  311. %type <tlst> SymbolList
  312. %type <vval> Value BuiltinValue
  313. %type <vval> AssignedIdentifier
  314. %type <vval> DefinedValue DefinedValue_Import
  315. %type <vval> ObjectIdentifierValue
  316. %type <vval> OctetStringValue
  317. %type <vval> BitStringValue
  318. %type <vval> ExceptionSpec
  319. %type <vval> ExceptionIdentification
  320. %type <vval> MibDefValPart
  321. %type <vval> LowerEndpoint LowerEndValue UpperEndpoint UpperEndValue
  322. %type <vval> ReferencedValue
  323. %type <vval> BooleanValue
  324. %type <vval> CharacterStringValue RestrictedCharacterStringValue
  325. %type <vval> CharacterStringList Quadruple Tuple
  326. %type <vval> ChoiceValue
  327. %type <vval> NullValue
  328. %type <vval> RealValue NumericRealValue SpecialRealValue 
  329. %type <vval> SequenceValue NamedValue
  330. /*!!!! %type <vval> SequenceOfValue */
  331. %type <vval> ParameterizedValue
  332. %type <vlst> ComponentValueList
  333. %type <vlst> MibVarPart MibVarTypes
  334. %type <nval> NamedBit
  335. %type <nval> EnumerationItem
  336. %type <nval> NamedNumber
  337. %type <nlst> NamedBitList
  338. %type <nlst> Enumeration
  339. %type <nlst> NamedNumberList
  340. %type <elmt> IntersectionElements
  341. %type <elmt> Elements
  342. %type <elmt> Exclusions
  343. %type <elmt> SubtypeElements
  344. %type <elmt> ObjectSetElements
  345. %type <elmt> ValueRange
  346. %type <elmt> PermittedAlphabet
  347. %type <elmt> InnerTypeConstraints
  348. %type <elmt> MultipleTypeConstraints
  349. %type <elmt> SizeConstraint
  350. %type <elmt> UserDefinedConstraintParameterList
  351. %type <elmt> NamedConstraint
  352. %type <elst> ElementSetSpec Unions Intersections TypeConstraints
  353. %type <cons> Constraint
  354. %type <cons> ConstraintSpec
  355. %type <cons> ElementSetSpecs 
  356. %type <cons> GeneralConstraint
  357. %type <cons> UserDefinedConstraint
  358. %type <cons> TableConstraint
  359. %type <cons> ComponentRelationConstraint
  360. %type <cons> ObjectSet
  361. %type <tagv> Tag
  362. %union {
  363.   PInt64           ival;
  364.   PString         * sval;
  365.   PStringList         * slst;
  366.   TypeBase         * tval;
  367.   TypesList         * tlst;
  368.   ValueBase         * vval;
  369.   ValuesList            * vlst;
  370.   NamedNumber         * nval;
  371.   NamedNumberList       * nlst;
  372.   Constraint            * cons;
  373.   ConstraintElementList * elst;
  374.   ConstraintElementBase * elmt;
  375.   struct {
  376.     Tag::Type tagClass;
  377.     unsigned tagNumber;
  378.   } tagv;
  379. }
  380. %%
  381. ModuleDefinition
  382.   : MODULEREFERENCE DefinitiveIdentifier DEFINITIONS TagDefault ASSIGNMENT BEGIN_t
  383.       {
  384. Module = new ModuleDefinition($1, $2, (Tag::Mode)$4);
  385. ReferenceTokenContext = TYPEREFERENCE;
  386.       }
  387.     ModuleBody END
  388.   ;
  389. DefinitiveIdentifier
  390.   : '{' DefinitiveObjIdComponentList '}'
  391. {
  392.   $$ = $2;
  393. }
  394.   | /* empty */
  395. {
  396.   $$ = new PStringList;
  397. }
  398.   ;
  399. DefinitiveObjIdComponentList
  400.   : DefinitiveObjIdComponent
  401.       {
  402. $$ = new PStringList;
  403. $$->Append($1);
  404.       }
  405.   | DefinitiveObjIdComponent DefinitiveObjIdComponentList
  406.       {
  407. $2->InsertAt(0, $1);
  408. $$ = $2;
  409.       }
  410.   ;
  411. DefinitiveObjIdComponent
  412.   : IDENTIFIER
  413.   | INTEGER
  414.       {
  415. $$ = new PString(PString::Unsigned, (int)$1);
  416.       }
  417.   | DefinitiveNameAndNumberForm
  418.   ;
  419. DefinitiveNameAndNumberForm
  420.   : IDENTIFIER '(' INTEGER ')'
  421.       {
  422. delete $1;
  423. $$ = new PString(PString::Unsigned, (int)$3);
  424.       }
  425.   ;
  426. TagDefault
  427.   : EXPLICIT TAGS
  428.       {
  429. $$ = Tag::Explicit;
  430.       }
  431.   | IMPLICIT TAGS 
  432.       {
  433. $$ = Tag::Implicit;
  434.       }
  435.   | AUTOMATIC TAGS 
  436.       {
  437. $$ = Tag::Automatic;
  438.       }
  439.   | /* empty */
  440.       {
  441. $$ = Tag::Explicit;
  442.       }
  443.   ;
  444. /*************************************/
  445. ModuleBody
  446.   : Exports Imports AssignmentList
  447.   | /* empty */
  448.   ;
  449. Exports
  450.   : EXPORTS SymbolsExported ';'
  451.   | /* empty */
  452.   ;
  453. SymbolsExported
  454.   : SymbolList
  455.       {
  456. Module->SetExports($1);
  457.       }
  458.   | /* empty */
  459.       {
  460. Module->SetExportAll();
  461.       }
  462.   ;
  463. Imports
  464.   : IMPORTS SymbolsImported ';' 
  465.   | /* empty */
  466.   ;
  467. SymbolsImported
  468.   : SymbolsFromModuleList
  469.   | /* empty */
  470.   ;
  471. SymbolsFromModuleList
  472.   : SymbolsFromModule
  473.   | SymbolsFromModuleList SymbolsFromModule
  474.   ;
  475. SymbolsFromModule
  476.   : SymbolList FROM
  477.       {
  478. CurrentImportList = $1;
  479. ReferenceTokenContext = MODULEREFERENCE;
  480.       }
  481.     GlobalModuleReference
  482.       {
  483. if (!HasObjectTypeMacro) {
  484.   HasObjectTypeMacro = $1->GetValuesIndex(SearchType("OBJECT-TYPE")) != P_MAX_INDEX;
  485.   if (HasObjectTypeMacro)
  486.     PError << "Info: including OBJECT-TYPE macro" << endl;
  487. }
  488. Module->AddImport(new ImportModule($4, $1));
  489. ReferenceTokenContext = TYPEREFERENCE;
  490. CurrentImportList = NULL;
  491.       }
  492.   ;
  493. GlobalModuleReference
  494.   : MODULEREFERENCE
  495.       {
  496. ReferenceTokenContext = TYPEREFERENCE;
  497.         BraceTokenContext = OID_BRACE;
  498.       }
  499.     AssignedIdentifier
  500.       {
  501.         BraceTokenContext = '{';
  502. delete $3;
  503.       }
  504.   ;
  505. AssignedIdentifier
  506.   : DefinedValue_Import
  507.   | ObjectIdentifierValue
  508.   | /* empty */
  509.       {
  510. $$ = NULL;
  511.       }
  512.   ;
  513. DefinedValue_Import
  514.   : ExternalValueReference
  515.       {
  516. $$ = new DefinedValue($1);
  517.       }
  518.   | IMPORT_IDENTIFIER
  519.       {
  520. $$ = new DefinedValue($1);
  521.       }
  522.   ;
  523. SymbolList
  524.   : Symbol
  525.       {
  526. $$ = new TypesList;
  527. $$->Append($1);
  528.       }
  529.   | Symbol ',' SymbolList
  530.       {
  531. $3->Append($1);
  532. $$ = $3;
  533.       }
  534.   ;
  535. Symbol
  536.   : Reference
  537.       {
  538. $$ = new ImportedType($1, FALSE);
  539.       }
  540.   | ParameterizedReference    /* only required for X.683 */
  541.   ;
  542. /*************************************/
  543. AssignmentList: Assignment 
  544.   | AssignmentList Assignment
  545.   ;
  546. Assignment
  547.   : TypeAssignment
  548.   | ValueAssignment
  549.   | ValueSetTypeAssignment 
  550.   | ObjectClassAssignment
  551.   | ObjectAssignment
  552.   | ObjectSetAssignment
  553.   | ParameterizedAssignment
  554.   /* We do not have "real" macros, so fake MIB ones */
  555.   | MacroDefinition
  556.   | ObjectTypeDefinition
  557.   | TrapTypeDefinition
  558.   ;
  559. ValueSetTypeAssignment
  560.   : TYPEREFERENCE Type
  561.       {
  562. $2->SetName($1);
  563. Module->AddType($2);
  564. IdentifierTokenContext = $2->GetIdentifierTokenContext();
  565. BraceTokenContext = $2->GetBraceTokenContext();
  566.       }
  567.     ASSIGNMENT ValueSet
  568.       {
  569. IdentifierTokenContext = IDENTIFIER;
  570. BraceTokenContext = '{';
  571.       }
  572.   ;
  573. /********/
  574. TypeAssignment
  575.   : TYPEREFERENCE ASSIGNMENT Type
  576.       {
  577. $3->SetName($1);
  578. Module->AddType($3);
  579.       }
  580.   ;
  581. Type
  582.   : ConstrainedType
  583.   | ReferencedType
  584.   | BuiltinType
  585.   ;
  586. BuiltinType
  587.   : BitStringType
  588.   | BooleanType 
  589.   | CharacterStringType 
  590.   | ChoiceType 
  591.   | EmbeddedPDVType 
  592.   | EnumeratedType 
  593.   | ExternalType 
  594.   | AnyType 
  595.   | InstanceOfType
  596.     { }
  597.   | IntegerType 
  598.   | NullType 
  599.   | ObjectClassFieldType
  600.   | ObjectIdentifierType 
  601.   | OctetStringType 
  602.   | RealType 
  603.   | SequenceType 
  604.   | SequenceOfType 
  605.   | SetType 
  606.   | SetOfType 
  607.   | TaggedType
  608.   ;
  609. ReferencedType
  610.   : DefinedType
  611.   | UsefulType
  612.   | SelectionType
  613.   | TypeFromObject
  614. /*!!! syntactically identical to TypeFromObject
  615.   | ValueSetFromObjects
  616. */
  617.   ;
  618. DefinedType
  619.   : ExternalTypeReference
  620.       {
  621. $$ = new DefinedType($1, FALSE);
  622.       }
  623.   | TYPEREFERENCE 
  624.       {
  625. $$ = new DefinedType($1,
  626.      DummyParameters != NULL &&
  627.      DummyParameters->GetValuesIndex(*$1) != P_MAX_INDEX);
  628.       }
  629.   | ParameterizedType
  630. /*| ParameterizedValueSetType synonym for ParameterizedType */
  631.   ;
  632. ExternalTypeReference
  633.   : MODULEREFERENCE '.' TYPEREFERENCE
  634.       {
  635. *$1 += *$3;
  636. delete $3;
  637.       }
  638.   ;
  639. BitStringType
  640.   : BIT STRING 
  641.       {
  642. $$ = new BitStringType;
  643.       }
  644.   | BIT STRING '{' NamedBitList '}'
  645.       {
  646. $$ = new BitStringType($4);
  647.       }
  648.   ;
  649. NamedBitList
  650.   : NamedBit 
  651.       {
  652. $$ = new NamedNumberList;
  653. $$->Append($1);
  654.       }
  655.   | NamedBitList ',' NamedBit
  656.       {
  657. $1->InsertAt(0, $3);
  658.       }
  659.   ;
  660. NamedBit
  661.   : IDENTIFIER '(' INTEGER ')' 
  662.       {
  663. $$ = new NamedNumber($1, (int)$3);
  664.       }
  665.   | IDENTIFIER '(' DefinedValue ')'
  666.       {
  667. $$ = new NamedNumber($1, ((DefinedValue*)$3)->GetReference());
  668. delete $3;
  669.       }
  670.   ;
  671. BooleanType
  672.   : BOOLEAN_t
  673.       {
  674. $$ = new BooleanType;
  675.       }
  676.   ;
  677. CharacterStringType
  678.   : RestrictedCharacterStringType
  679.   | UnrestrictedCharacterStringType
  680.   ;
  681. RestrictedCharacterStringType
  682.   : BMPString
  683.       {
  684. $$ = new BMPStringType;
  685.       }
  686.   | GeneralString
  687.       {
  688. $$ = new GeneralStringType;
  689.       }
  690.   | GraphicString
  691.       {
  692. $$ = new GraphicStringType;
  693.       }
  694.   | IA5String
  695.       {
  696. $$ = new IA5StringType;
  697.       }
  698.   | ISO646String
  699.       {
  700. $$ = new ISO646StringType;
  701.       }
  702.   | NumericString
  703.       {
  704. $$ = new NumericStringType;
  705.       }
  706.   | PrintableString
  707.       {
  708. $$ = new PrintableStringType;
  709.       }
  710.   | TeletexString
  711.       {
  712. $$ = new TeletexStringType;
  713.       }
  714.   | T61String
  715.       {
  716. $$ = new T61StringType;
  717.       }
  718.   | UniversalString
  719.       {
  720. $$ = new UniversalStringType;
  721.       }
  722.   | VideotexString
  723.       {
  724. $$ = new VideotexStringType;
  725.       }
  726.   | VisibleString
  727.       {
  728. $$ = new VisibleStringType;
  729.       }
  730.   ;
  731. UnrestrictedCharacterStringType
  732.   : CHARACTER STRING
  733.       {
  734. $$ = new UnrestrictedCharacterStringType;
  735.       }
  736.   ;
  737. ChoiceType
  738.   : CHOICE '{' AlternativeTypeLists '}'
  739.       {
  740. $$ = $3;
  741.       }
  742.   ;
  743. AlternativeTypeLists
  744.   : AlternativeTypeList
  745.       {
  746. $$ = new ChoiceType($1);
  747.       }
  748.   | AlternativeTypeList ',' ExtensionAndException
  749.       {
  750. $$ = new ChoiceType($1, TRUE);
  751.       }
  752.   | AlternativeTypeList ',' ExtensionAndException  ','  AlternativeTypeList
  753.       {
  754. $$ = new ChoiceType($1, TRUE, $5);
  755.       }
  756.   ;
  757. AlternativeTypeList
  758.   : NamedType
  759.       {
  760. $$ = new TypesList;
  761. $$->Append($1);
  762.       }
  763.   | AlternativeTypeList ',' NamedType
  764.       {
  765. $1->Append($3);
  766.       }
  767.   ;
  768. ExtensionAndException
  769.   : '.' '.' '.' ExceptionSpec
  770.   ;
  771. NamedType
  772.   : IDENTIFIER Type
  773.       {
  774. $2->SetName($1);
  775. $$ = $2;
  776.       }
  777.   | Type      /* ITU-T Rec. X.680 Appendix H.1 */
  778.       {
  779. PError << StdError(Warning) << "unnamed field." << endl;
  780. $1->SetName(new PString(PString::Printf, "_unnamed%u", UnnamedFieldCount++));
  781.       }
  782. /*| SelectionType    /* Unnecessary as have rule in Type for this */
  783.   ;
  784. EmbeddedPDVType
  785.   : EMBEDDED PDV
  786.       {
  787. $$ = new EmbeddedPDVType;
  788.       }
  789.   ;
  790. EnumeratedType
  791.   : ENUMERATED '{' Enumerations '}'
  792.       {
  793. $$ = $3;
  794.       }
  795.   ;
  796. Enumerations
  797.   : Enumeration
  798.       {
  799. $$ = new EnumeratedType($1, FALSE, NULL);
  800.       }
  801.   | Enumeration  ',' '.' '.' '.'
  802.       {
  803. $$ = new EnumeratedType($1, TRUE, NULL);
  804.       }
  805.   | Enumeration  ',' '.' '.' '.' ',' Enumeration
  806.       {
  807. $$ = new EnumeratedType($1, TRUE, $7);
  808.       }
  809.   ;
  810. Enumeration
  811.   : EnumerationItem
  812.       {
  813. $$ = new NamedNumberList;
  814. $$->Append($1);
  815.       }
  816.   | Enumeration ',' EnumerationItem
  817.       {
  818. $1->Append($3);
  819. $3->SetAutoNumber((*$1)[1]);
  820. $$ = $1;
  821.       }
  822.   ;
  823. EnumerationItem
  824.   : IDENTIFIER
  825.       {
  826. $$ = new NamedNumber($1);
  827.       }
  828.   | NamedNumber
  829.   ;
  830. ExternalType
  831.   : EXTERNAL
  832.       {
  833. $$ = new ExternalType;
  834.       }
  835.   ;
  836. AnyType
  837.   : ANY
  838.       {
  839. $$ = new AnyType(NULL);
  840.       }
  841.   | ANY DEFINED BY IDENTIFIER
  842.       {
  843. $$ = new AnyType($4);
  844.       }
  845.   ;
  846. InstanceOfType
  847.   : INSTANCE OF_t DefinedObjectClass
  848.   ;
  849. IntegerType
  850.   : INTEGER_t
  851.       {
  852. $$ = new IntegerType;
  853.       }
  854.   | INTEGER_t '{' NamedNumberList '}'
  855.       {
  856. $$ = new IntegerType($3);
  857.       }
  858.   ;
  859. NullType
  860.   : NULL_TYPE
  861.       {
  862. $$ = new NullType;
  863.       }
  864.   ;
  865. ObjectClassFieldType
  866.   : DefinedObjectClass '.' FieldName
  867.       {
  868. $$ = new ObjectClassFieldType($1, $3);
  869.       }
  870.   ;
  871. ObjectIdentifierType
  872.   : OBJECT IDENTIFIER_t
  873.       {
  874. $$ = new ObjectIdentifierType;
  875.       }
  876.   ;
  877. OctetStringType
  878.   : OCTET STRING
  879.       {
  880. $$ = new OctetStringType;
  881.       }
  882.   ;
  883. RealType
  884.   : REAL
  885.       {
  886. $$ = new RealType;
  887.       }
  888.   ;
  889. SequenceType
  890.   : SEQUENCE '{' ComponentTypeLists '}'
  891.       {
  892. $$ = $3;
  893.       }
  894.   | SEQUENCE '{'  '}'
  895.       {
  896. $$ = new SequenceType(NULL, FALSE, NULL);
  897.       }
  898.   | SEQUENCE '{' ExtensionAndException '}'
  899.       {
  900. $$ = new SequenceType(NULL, TRUE, NULL);
  901.       }
  902.   ;
  903. ComponentTypeLists
  904.   : ComponentTypeList
  905.       {
  906. $$ = new SequenceType($1, FALSE, NULL);
  907.       }
  908.   | ComponentTypeList ',' ExtensionAndException
  909.       {
  910. $$ = new SequenceType($1, TRUE, NULL);
  911.       }
  912.   | ComponentTypeList ',' ExtensionAndException ',' ComponentTypeList
  913.       {
  914. $$ = new SequenceType($1, TRUE, $5);
  915.       }
  916.   | ExtensionAndException ',' ComponentTypeList
  917.       {
  918. $$ = new SequenceType(NULL, TRUE, $3);
  919.       }
  920.   ;
  921. ComponentTypeList
  922.   : ComponentType
  923.       {
  924. $$ = new TypesList;
  925. $$->Append($1);
  926.       }
  927.   | ComponentTypeList ',' ComponentType
  928.       {
  929. $1->Append($3);
  930.       }
  931.   ;
  932. ComponentType
  933.   : NamedType
  934.   | NamedType OPTIONAL_t
  935.       {
  936. $1->SetOptional();
  937.       }
  938.   | NamedType DEFAULT
  939.       {
  940. IdentifierTokenContext = $1->GetIdentifierTokenContext();
  941.       }
  942.     Value   
  943.       {
  944. IdentifierTokenContext = IDENTIFIER;
  945. $1->SetDefaultValue($4);
  946.       }
  947.   | COMPONENTS OF_t Type
  948.       {
  949. $$ = $3;
  950.       }
  951.   ;
  952. SequenceOfType
  953.   : SEQUENCE OF_t Type
  954.       {
  955. $$ = new SequenceOfType($3, NULL);
  956.       }
  957.   ;
  958. SetType
  959.   : SET '{' ComponentTypeLists '}' 
  960.       {
  961. $$ = new SetType((SequenceType*)$3);
  962.       }
  963.   | SET '{'  '}'
  964.       {
  965. $$ = new SetType;
  966.       }
  967.   ;
  968. SetOfType
  969.   : SET OF_t Type
  970.       {
  971. $$ = new SetOfType($3, NULL);
  972.       }
  973.   ;
  974. TaggedType
  975.   : Tag Type
  976.       {
  977. $2->SetTag($1.tagClass, $1.tagNumber, Module->GetDefaultTagMode());
  978. $$ = $2;
  979.       }
  980.   | Tag IMPLICIT Type  
  981.       {
  982. $3->SetTag($1.tagClass, $1.tagNumber, Tag::Implicit);
  983. $$ = $3;
  984.       }
  985.   | Tag EXPLICIT Type
  986.       {
  987. $3->SetTag($1.tagClass, $1.tagNumber, Tag::Explicit);
  988. $$ = $3;
  989.       }
  990.   ;
  991. Tag
  992.   : '[' Class ClassNumber ']'
  993.       {
  994. $$.tagClass = (Tag::Type)$2;
  995. $$.tagNumber = (int)$3;
  996.       }
  997.   ;
  998. ClassNumber
  999.   : INTEGER 
  1000.   | DefinedValue
  1001.       {
  1002. if ($1->IsDescendant(IntegerValue::Class()))
  1003.   $$ = *(IntegerValue*)$1;
  1004. else
  1005.   PError << StdError(Fatal) << "incorrect value type." << endl;
  1006.       }
  1007.   ;
  1008. Class
  1009.   : UNIVERSAL
  1010.       {
  1011. $$ = Tag::Universal;
  1012.       }
  1013.   | APPLICATION
  1014.       {
  1015. $$ = Tag::Application;
  1016.       }
  1017.   | PRIVATE
  1018.       {
  1019. $$ = Tag::Private;
  1020.       }
  1021.   | /* empty */
  1022.       {
  1023. $$ = Tag::ContextSpecific;
  1024.       }
  1025.   ;
  1026. SelectionType
  1027.   : IDENTIFIER '<' Type
  1028.       {
  1029. $$ = new SelectionType($1, $3);
  1030.       }
  1031.   ;
  1032. UsefulType
  1033.   : GeneralizedTime
  1034.       {
  1035. $$ = new GeneralizedTimeType;
  1036.       }
  1037.   | UTCTime
  1038.       {
  1039. $$ = new UTCTimeType;
  1040.       }
  1041.   | ObjectDescriptor_t
  1042.       {
  1043. $$ = new ObjectDescriptorType;
  1044.       }
  1045.   ;
  1046. TypeFromObject
  1047.   : ReferencedObjects '.' FieldName
  1048.     { }
  1049.   ;
  1050. /*!!!
  1051. ValueSetFromObjects
  1052.   : ReferencedObjects '.' FieldName
  1053.   ;
  1054. */
  1055. ReferencedObjects
  1056.   : DefinedObject
  1057.   | ParameterizedObject
  1058.   | DefinedObjectSet
  1059.     { }
  1060.   | ParameterizedObjectSet
  1061.     { }
  1062.   ;
  1063. ParameterizedObject
  1064.   : DefinedObject ActualParameterList
  1065.   ;
  1066. /********/
  1067. ConstrainedType
  1068.   : Type Constraint
  1069.       {
  1070. $1->AddConstraint($2);
  1071.       }
  1072.   | TypeWithConstraint
  1073.   ;
  1074. TypeWithConstraint
  1075.   : SET Constraint OF_t Type
  1076.       {
  1077. $$ = new SetOfType($4, $2);
  1078.       }
  1079.   | SET SizeConstraint OF_t Type
  1080.       {
  1081. $$ = new SetOfType($4, new Constraint($2));
  1082.       }
  1083.   | SEQUENCE Constraint OF_t Type
  1084.       {
  1085. $$ = new SequenceOfType($4, $2);
  1086.       }
  1087.   | SEQUENCE SizeConstraint OF_t Type
  1088.       {
  1089. $$ = new SequenceOfType($4, new Constraint($2));
  1090.       }
  1091.   ;
  1092. Constraint
  1093.   : '(' ConstraintSpec ExceptionSpec ')'
  1094.       {
  1095. $$ = $2;
  1096.       }
  1097.   ;
  1098. ConstraintSpec
  1099.   : ElementSetSpecs
  1100.   | GeneralConstraint
  1101.   ;
  1102. ExceptionSpec
  1103.   : '!' ExceptionIdentification 
  1104.       {
  1105. $$ = $2;
  1106.       }
  1107.   | /* empty */
  1108.       {
  1109. $$ = NULL;
  1110.       }
  1111.   ;
  1112. ExceptionIdentification
  1113.   : SignedNumber
  1114.       {
  1115. $$ = new IntegerValue($1);
  1116.       }
  1117.   | DefinedValue
  1118.   | Type ':' Value
  1119.       {
  1120. delete $1;
  1121.         PError << StdError(Warning) << "Typed exception unsupported" << endl;
  1122. $$ = $3;
  1123.       }
  1124.   ;
  1125. ElementSetSpecs
  1126.   : ElementSetSpec
  1127.       {
  1128. $$ = new Constraint($1, FALSE, NULL);
  1129.       }
  1130.   | ElementSetSpec  ',' '.' '.' '.'
  1131.       {
  1132. $$ = new Constraint($1, TRUE, NULL);
  1133.       }
  1134.   | '.' '.' '.' ',' ElementSetSpec
  1135.       {
  1136. $$ = new Constraint(NULL, TRUE, $5);
  1137.       }
  1138.   | ElementSetSpec  ',' '.' '.' '.' ElementSetSpec
  1139.       {
  1140. $$ = new Constraint($1, TRUE, $6);
  1141.       }
  1142.   ;
  1143. ElementSetSpec
  1144.   : Unions
  1145.   | ALL Exclusions
  1146.       {
  1147. $$ = new ConstraintElementList;
  1148. $$->Append(new ConstrainAllConstraintElement($2));
  1149.       }
  1150.   ;
  1151. Unions
  1152.   : Intersections
  1153.       {
  1154. $$ = new ConstraintElementList;
  1155. $$->Append(new ElementListConstraintElement($1));
  1156.       }
  1157.   | Unions UnionMark Intersections
  1158.       {
  1159. $1->Append(new ElementListConstraintElement($3));
  1160.       }
  1161.   ;
  1162. Intersections
  1163.   : IntersectionElements 
  1164.       {
  1165. $$ = new ConstraintElementList;
  1166. $$->Append($1);
  1167.       }
  1168.   | Intersections IntersectionMark IntersectionElements
  1169.       {
  1170. $1->Append($3);
  1171.       }
  1172.   ;
  1173. IntersectionElements
  1174.   : Elements 
  1175.   | Elements Exclusions
  1176.       {
  1177. $1->SetExclusions($2);
  1178.       }
  1179.   ;
  1180. Exclusions
  1181.   : EXCEPT Elements
  1182.       {
  1183. $$ = $2;
  1184.       }
  1185.   ;
  1186. UnionMark
  1187.   : '|'
  1188.   | UNION
  1189.   ;
  1190. IntersectionMark
  1191.   : '^'
  1192.   | INTERSECTION
  1193.   ;
  1194. Elements
  1195.   : SubtypeElements
  1196.   | ObjectSetElements
  1197.   | '(' ElementSetSpec ')'
  1198.       {
  1199. $$ = new ElementListConstraintElement($2);
  1200.       }
  1201.   ;
  1202. SubtypeElements
  1203.   : Value
  1204.       {
  1205. $$ = new SingleValueConstraintElement($1);
  1206.       }
  1207.   | ContainedSubtype
  1208.       {
  1209. $$ = new SubTypeConstraintElement($1);
  1210.       }
  1211.   | ValueRange
  1212.   | PermittedAlphabet
  1213.   | SizeConstraint
  1214. /*| TypeConstraint  This is really Type and causes ambiguity with ContainedSubtype */
  1215.   | InnerTypeConstraints
  1216.   ;
  1217. ValueRange
  1218.   : LowerEndpoint '.' '.' UpperEndpoint
  1219.       {
  1220. $$ = new ValueRangeConstraintElement($1, $4);
  1221.       }
  1222.   ;
  1223. LowerEndpoint
  1224.   : LowerEndValue
  1225.   | LowerEndValue '<'
  1226.   ;
  1227. UpperEndpoint
  1228.   : UpperEndValue
  1229.   | '<' UpperEndValue
  1230.       {
  1231. $$ = $2;
  1232.       }
  1233.   ;
  1234. LowerEndValue
  1235.   : Value 
  1236.   | MIN
  1237.       {
  1238. $$ = new MinValue;
  1239.       }
  1240.   ;
  1241. UpperEndValue
  1242.   : Value 
  1243.   | MAX
  1244.       {
  1245. $$ = new MaxValue;
  1246.       }
  1247.   ;
  1248. PermittedAlphabet
  1249.   : FROM Constraint
  1250.       {
  1251. $$ = new FromConstraintElement($2);
  1252.       }
  1253.   ;
  1254. ContainedSubtype
  1255.   : INCLUDES Type
  1256.       {
  1257. $$ = $2;
  1258.       }
  1259. /*| Type  Actual grammar has INCLUDES keyword optional but this is
  1260.  horribly ambiguous, so only support  a few specific Type
  1261.  definitions */
  1262.   | ConstrainedType
  1263.   | BuiltinType
  1264.   | DefinedType
  1265.   | UsefulType
  1266.   ;
  1267. SizeConstraint
  1268.   : SIZE_t Constraint
  1269.       {
  1270. $$ = new SizeConstraintElement($2);
  1271.       }
  1272.   ;
  1273. InnerTypeConstraints
  1274.   : WITH COMPONENT Constraint
  1275.       {
  1276. $$ = new WithComponentConstraintElement(NULL, $3, WithComponentConstraintElement::Default);
  1277.       }
  1278.   | WITH COMPONENTS MultipleTypeConstraints
  1279.       {
  1280. $$ = $3;
  1281.       }
  1282.   ;
  1283. MultipleTypeConstraints
  1284.   : '{' TypeConstraints '}' /* FullSpecification */
  1285.       {
  1286. $$ = new InnerTypeConstraintElement($2, FALSE);
  1287.       }
  1288.   | '{'  '.' '.' '.' ',' TypeConstraints '}' /* PartialSpecification */
  1289.       {
  1290. $$ = new InnerTypeConstraintElement($6, TRUE);
  1291.       }
  1292.   ;
  1293. TypeConstraints
  1294.   : NamedConstraint
  1295.       {
  1296. $$ = new ConstraintElementList;
  1297. $$->Append($1);
  1298.       }
  1299.   | NamedConstraint ',' TypeConstraints
  1300.       {
  1301. $3->Append($1);
  1302. $$ = $3;
  1303.       }
  1304.   ;
  1305. NamedConstraint
  1306.   : IDENTIFIER PresenceConstraint
  1307.       {
  1308. $$ = new WithComponentConstraintElement($1, NULL, (int)$2);
  1309.       }
  1310.   | IDENTIFIER Constraint PresenceConstraint 
  1311.       {
  1312. $$ = new WithComponentConstraintElement($1, $2, (int)$3);
  1313.       }
  1314.   ;
  1315. PresenceConstraint
  1316.   : PRESENT
  1317.       {
  1318. $$ = WithComponentConstraintElement::Present;
  1319.       }
  1320.   | ABSENT 
  1321.       {
  1322. $$ = WithComponentConstraintElement::Absent;
  1323.       }
  1324.   | OPTIONAL_t
  1325.       {
  1326. $$ = WithComponentConstraintElement::Optional;
  1327.       }
  1328.   | /* empty */
  1329.       {
  1330. $$ = WithComponentConstraintElement::Default;
  1331.       }
  1332.   ;
  1333. GeneralConstraint
  1334.   : UserDefinedConstraint
  1335.   | TableConstraint
  1336.   ;
  1337. UserDefinedConstraint
  1338.   : CONSTRAINED BY '{' UserDefinedConstraintParameterList '}'
  1339.     {
  1340.       $$ = new Constraint($4);
  1341.     }
  1342.   ;
  1343. UserDefinedConstraintParameterList
  1344.   : /* empty */
  1345.       {
  1346. $$ = new UserDefinedConstraintElement(NULL);
  1347.       }
  1348.   | UserDefinedConstraintParameters
  1349.       {
  1350. $$ = new UserDefinedConstraintElement($1);
  1351.       }
  1352.   ;
  1353.  
  1354. UserDefinedConstraintParameters
  1355.   : UserDefinedConstraintParameter ',' UserDefinedConstraintParameters
  1356.       {
  1357. $3->Append($1);
  1358. $$ = $3;
  1359.       }
  1360.   | UserDefinedConstraintParameter
  1361.       {
  1362. $$ = new TypesList;
  1363. $$->Append($1);
  1364.       }
  1365.   ;
  1366. UserDefinedConstraintParameter
  1367.   : Governor ':' ActualParameter
  1368.       {
  1369. $$ = $3;
  1370.       }
  1371.   | ActualParameter
  1372.   ;
  1373. TableConstraint
  1374.   : ObjectSet /* SimpleTableConstraint */
  1375.   | ComponentRelationConstraint
  1376.   ;
  1377. ComponentRelationConstraint
  1378.   : '{' DefinedObjectSet '}' '{' AtNotations '}'
  1379.     { $$ = NULL; }
  1380.   ;
  1381. AtNotations
  1382.   : AtNotations ',' AtNotation
  1383.   | AtNotation
  1384.   ;
  1385. AtNotation
  1386.   : '@' ComponentIdList
  1387.   | '@' '.' ComponentIdList
  1388.   ;
  1389. ComponentIdList
  1390.   : ComponentIdList '.' IDENTIFIER
  1391.   | IDENTIFIER
  1392.   ;
  1393. /********/
  1394. ObjectClassAssignment
  1395.   : OBJECTCLASSREFERENCE ASSIGNMENT ObjectClass
  1396.     { }
  1397.   ;
  1398. ObjectAssignment
  1399.   : OBJECTREFERENCE DefinedObjectClass ASSIGNMENT Object
  1400.     { }
  1401.   ;
  1402. ObjectSetAssignment
  1403.   : OBJECTSETREFERENCE DefinedObjectClass ASSIGNMENT ObjectSet
  1404.     { }
  1405.   ;
  1406. ObjectClass
  1407.   : DefinedObjectClass
  1408.     { }
  1409.   | ObjectClassDefn 
  1410.   | ParameterizedObjectClass
  1411.   ;
  1412. DefinedObjectClass
  1413.   : ExternalObjectClassReference
  1414.   | OBJECTCLASSREFERENCE
  1415.   | UsefulObjectClassReference
  1416.   ;
  1417. ExternalObjectClassReference
  1418.   : MODULEREFERENCE '.' OBJECTCLASSREFERENCE
  1419.       {
  1420. $$ = ConcatNames($1, '.', $3);
  1421.       }
  1422.   ;
  1423. UsefulObjectClassReference
  1424.   : TYPE_IDENTIFIER
  1425.       {
  1426. $$ = new PString("TYPE-IDENTIFIER");
  1427.       }
  1428.   | ABSTRACT_SYNTAX
  1429.       {
  1430. $$ = new PString("ABSTRACT-SYNTAX");
  1431.       }
  1432.   ;
  1433. ObjectClassDefn
  1434.   : CLASS  '{'  FieldSpecs '}'  WithSyntaxSpec
  1435.   ;
  1436. FieldSpecs
  1437.   : FieldSpecs ',' FieldSpec
  1438.   | FieldSpec
  1439.   ;
  1440. FieldSpec
  1441.   : TypeFieldSpec
  1442.   | FixedTypeValueFieldSpec
  1443.   | VariableTypeValueFieldSpec
  1444.   | FixedTypeValueSetFieldSpec
  1445.   | VariableTypeValueSetFieldSpec
  1446.   | ObjectFieldSpec
  1447.   | ObjectSetFieldSpec
  1448.   ;
  1449. TypeFieldSpec
  1450.   : TYPEFIELDREFERENCE TypeOptionalitySpec
  1451.     { }
  1452.   ;
  1453. TypeOptionalitySpec
  1454.   : OPTIONAL_t
  1455.   | DEFAULT Type
  1456.   | /* empty */
  1457.   ;
  1458. FixedTypeValueFieldSpec
  1459.   : VALUEFIELDREFERENCE Type Unique ValueOptionalitySpec
  1460.     { }
  1461.   ;
  1462. Unique
  1463.   : UNIQUE
  1464.   | /* empty */
  1465.   ;
  1466. ValueOptionalitySpec
  1467.   : OPTIONAL_t
  1468.   | DEFAULT Value
  1469.   | /* empty */
  1470.   ;
  1471. VariableTypeValueFieldSpec
  1472.   : VALUEFIELDREFERENCE FieldName ValueOptionalitySpec
  1473.     { }
  1474.   ;
  1475. FixedTypeValueSetFieldSpec
  1476.   : VALUESETFIELDREFERENCE Type ValueSetOptionalitySpec
  1477.     { }
  1478.   ;
  1479. ValueSetOptionalitySpec
  1480.   : OPTIONAL_t
  1481.   | DEFAULT ValueSet
  1482.   | /* empty */
  1483.   ;
  1484. VariableTypeValueSetFieldSpec
  1485.   : VALUESETFIELDREFERENCE FieldName ValueSetOptionalitySpec
  1486.     { }
  1487.   ;
  1488. ObjectFieldSpec
  1489.   : OBJECTFIELDREFERENCE DefinedObjectClass ObjectOptionalitySpec
  1490.     { }
  1491.   ;
  1492. ObjectOptionalitySpec
  1493.   : OPTIONAL_t
  1494.   | DEFAULT Object
  1495.   | /* empty */
  1496.   ;
  1497. ObjectSetFieldSpec
  1498.   : OBJECTSETFIELDREFERENCE DefinedObjectClass ObjectSetOptionalitySpec
  1499.     { }
  1500.   ;
  1501. ObjectSetOptionalitySpec
  1502.   : OPTIONAL_t
  1503.   | DEFAULT ObjectSet
  1504.   | /* empty */
  1505.   ;
  1506. WithSyntaxSpec
  1507.   : WITH SYNTAX SyntaxList
  1508.   | /* empty */
  1509.   ;
  1510. SyntaxList
  1511.   : '{' TokenOrGroupSpecs '}'
  1512.   | '{' '}'
  1513.   ;
  1514. TokenOrGroupSpecs
  1515.   : TokenOrGroupSpecs TokenOrGroupSpec
  1516.   | TokenOrGroupSpec
  1517.   ;
  1518. TokenOrGroupSpec
  1519.   : RequiredToken
  1520.   | OptionalGroup
  1521.   ;
  1522. OptionalGroup
  1523.   : '[' TokenOrGroupSpecs ']'
  1524.   ;
  1525. RequiredToken
  1526.   : Literal
  1527.   | PrimitiveFieldName
  1528.     { }
  1529.   ;
  1530. Literal
  1531.   : BIT
  1532.   | BOOLEAN_t
  1533.   | CHARACTER
  1534.   | CHOICE
  1535.   | EMBEDDED
  1536.   | END
  1537.   | ENUMERATED
  1538.   | EXTERNAL
  1539.   | FALSE_t
  1540.   | INSTANCE
  1541.   | INTEGER
  1542.     { }
  1543.   | INTERSECTION
  1544.   | MINUS_INFINITY
  1545.   | NULL_TYPE
  1546.   | OBJECT
  1547.   | OCTET
  1548.   | PLUS_INFINITY
  1549.   | REAL
  1550.   | SEQUENCE
  1551.   | SET
  1552.   | TRUE_t
  1553.   | UNION
  1554.   | ','
  1555.   ;
  1556. DefinedObject
  1557.   : ExternalObjectReference
  1558.   | OBJECTREFERENCE
  1559.     { }
  1560.   ;
  1561. ExternalObjectReference
  1562.   : MODULEREFERENCE '.' OBJECTREFERENCE
  1563.     { }
  1564.   ;
  1565. ParameterizedObjectClass
  1566.   : DefinedObjectClass ActualParameterList
  1567.     { }
  1568.   ;
  1569. DefinedObjectSet
  1570.   : ExternalObjectSetReference
  1571.     { }
  1572.   | OBJECTSETREFERENCE
  1573.     { }
  1574.   ;
  1575. ExternalObjectSetReference
  1576.   : MODULEREFERENCE '.' OBJECTSETREFERENCE
  1577.     { }
  1578.   ;
  1579. ParameterizedObjectSet
  1580.   : DefinedObjectSet ActualParameterList
  1581.   ;
  1582. FieldName
  1583.   : FieldName '.' PrimitiveFieldName
  1584.       {
  1585. $$ = ConcatNames($1, '.', $3);
  1586.       }
  1587.   | PrimitiveFieldName
  1588.   ;
  1589. PrimitiveFieldName
  1590.   : TYPEFIELDREFERENCE
  1591.   | VALUEFIELDREFERENCE
  1592.   | VALUESETFIELDREFERENCE
  1593.   | OBJECTFIELDREFERENCE
  1594.   | OBJECTSETFIELDREFERENCE
  1595.   ;
  1596. Object
  1597.   : DefinedObject
  1598.     { }
  1599. /*!!!
  1600.   | ObjectDefn
  1601.     { }
  1602. */
  1603.   | ObjectFromObject
  1604.     { }
  1605.   | ParameterizedObject
  1606.     { }
  1607.   ;
  1608. /*!!!!
  1609. ObjectDefn
  1610.   : DefaultSyntax
  1611.   | DefinedSyntax
  1612.   ;
  1613. DefaultSyntax
  1614.   : '{' FieldSettings '}
  1615.   : '{' '}
  1616.   ;
  1617. FieldSettings
  1618.   : FieldSettings ',' FieldSetting
  1619.   | FieldSetting
  1620.   ;
  1621. FieldSetting
  1622.   : PrimitiveFieldName Setting
  1623.   ;
  1624. DefinedSyntax
  1625.   : '{' DefinedSyntaxTokens '}'
  1626.   '
  1627. DefinedSyntaxTokens
  1628.   : DefinedSyntaxTokens DefinedSyntaxToken
  1629.   | /* empty *//*
  1630.   ;
  1631. DefinedSyntaxToken
  1632.   : Literal
  1633.   | Setting
  1634.   ;
  1635. Setting
  1636.   : Type
  1637.   | Value
  1638.   | ValueSet
  1639.   | Object
  1640.   | ObjectSet
  1641.   ;
  1642. */
  1643. ObjectSet
  1644.   : '{' ElementSetSpec '}'
  1645.     { }
  1646.   ;
  1647. ObjectFromObject
  1648.   : ReferencedObjects '.' FieldName
  1649.   ;
  1650. ObjectSetElements
  1651.   : Object
  1652.     { }
  1653.   | DefinedObjectSet
  1654.     { }
  1655. /*!!!
  1656.   | ObjectSetFromObjects
  1657. */
  1658.   | ParameterizedObjectSet
  1659.     { }
  1660.   ;
  1661. /*!!!
  1662. ObjectSetFromObjects
  1663.   : ReferencedObjects '.' FieldName
  1664.   ;
  1665. */
  1666. /********/
  1667. ParameterizedAssignment
  1668.   : ParameterizedTypeAssignment
  1669.   | ParameterizedValueAssignment
  1670.   | ParameterizedValueSetTypeAssignment
  1671.   | ParameterizedObjectClassAssignment
  1672.   | ParameterizedObjectAssignment
  1673.   | ParameterizedObjectSetAssignment
  1674.   ;
  1675. ParameterizedTypeAssignment
  1676.   : TYPEREFERENCE ParameterList
  1677.       {
  1678. DummyParameters = $2;
  1679.       }
  1680.     ASSIGNMENT Type
  1681.       {
  1682. DummyParameters = NULL;
  1683. $5->SetName($1);
  1684. $5->SetParameters($2);
  1685. Module->AddType($5);
  1686.       }
  1687.   ;
  1688. ParameterizedValueAssignment
  1689.   : IDENTIFIER ParameterList Type ASSIGNMENT Value
  1690.     { }
  1691.   ;
  1692. ParameterizedValueSetTypeAssignment
  1693.   : TYPEREFERENCE ParameterList Type ASSIGNMENT ValueSet
  1694.     { }
  1695.   ;
  1696. ParameterizedObjectClassAssignment
  1697.   : OBJECTCLASSREFERENCE ParameterList ASSIGNMENT ObjectClass
  1698.     { }
  1699.   ;
  1700. ParameterizedObjectAssignment
  1701.   : OBJECTREFERENCE ParameterList DefinedObjectClass ASSIGNMENT Object
  1702.     { }
  1703.   ;
  1704. ParameterizedObjectSetAssignment
  1705.   : OBJECTSETREFERENCE ParameterList DefinedObjectClass ASSIGNMENT ObjectSet
  1706.     { }
  1707.   ;
  1708. ParameterList
  1709.   : '{' Parameters '}'
  1710.       {
  1711. $$ = $2;
  1712.       }
  1713.   ;
  1714. Parameters
  1715.   : Parameters ',' Parameter
  1716.       {
  1717. $$ = $1;
  1718. $$->Append($3);
  1719.       }
  1720.   | Parameter
  1721.       {
  1722. $$ = new PStringList;
  1723. $$->Append($1);
  1724.       }
  1725.   ;
  1726. Parameter
  1727.   : Governor ':' Reference
  1728.       {
  1729. $$ = $3;
  1730.       }
  1731.   | Reference
  1732.   ;
  1733. Governor
  1734.   : Type
  1735.     { }
  1736.   | DefinedObjectClass
  1737.     { }
  1738.   ;
  1739. ParameterizedType
  1740.   : SimpleDefinedType ActualParameterList
  1741.       {
  1742. $$ = new ParameterizedType($1, $2);
  1743.       }
  1744.   ;
  1745. SimpleDefinedType
  1746.   : ExternalTypeReference
  1747.   | TYPEREFERENCE
  1748.   ;
  1749. ActualParameterList
  1750.   : '{' ActualParameters '}'
  1751.       {
  1752. $$ = $2;
  1753.       }
  1754.   ;
  1755. ActualParameters
  1756.   : ActualParameters ',' ActualParameter
  1757.       {
  1758. $1->Append($3);
  1759. $$ = $1;
  1760.       }
  1761.   | ActualParameter
  1762.       {
  1763. $$ = new TypesList;
  1764. $$->Append($1);
  1765.       }
  1766.   ;
  1767. ActualParameter
  1768.   : Type
  1769.   | Value
  1770.     { }
  1771.   | ValueSet
  1772.     { }
  1773.   | DefinedObjectClass
  1774.     { }
  1775. /*!!!
  1776.   | Object
  1777.     { }
  1778.   | ObjectSet
  1779. */
  1780.   ;
  1781. /********/
  1782. ValueAssignment 
  1783.   : IDENTIFIER Type
  1784.       {
  1785. IdentifierTokenContext = $2->GetIdentifierTokenContext();
  1786. BraceTokenContext = $2->GetBraceTokenContext();
  1787. NullTokenContext = NULL_VALUE;
  1788.       }
  1789.     ASSIGNMENT Value
  1790.       {
  1791. $5->SetValueName($1);
  1792. Module->AddValue($5);
  1793. IdentifierTokenContext = IDENTIFIER;
  1794. BraceTokenContext = '{';
  1795. NullTokenContext = NULL_TYPE;
  1796.       }
  1797.   ;
  1798. Value
  1799.   : BuiltinValue
  1800.   | ReferencedValue
  1801.   ;
  1802. BuiltinValue
  1803.   : BitStringValue 
  1804.   | BooleanValue 
  1805.   | CharacterStringValue 
  1806.   | ChoiceValue 
  1807. /*| EmbeddedPDVValue  synonym to SequenceValue */
  1808. /*| EnumeratedValue   synonym to IDENTIFIER    */
  1809. /*| ExternalValue     synonym to SequenceValue */
  1810. /*| InstanceOfValue   synonym to Value */
  1811.   | SignedNumber      /* IntegerValue */
  1812.       {
  1813. $$ = new IntegerValue($1);
  1814.       }
  1815.   | NullValue 
  1816. /*!!!
  1817.   | ObjectClassFieldValue
  1818. */
  1819.   | ObjectIdentifierValue
  1820.   | OctetStringValue
  1821.   | RealValue 
  1822.   | SequenceValue 
  1823. /*!!!! 
  1824.   | SequenceOfValue
  1825. */
  1826. /*| SetValue       synonym to SequenceValue */
  1827. /*| SetOfValue       synonym to SequenceOfValue */
  1828. /*| TaggedValue       synonym to Value */
  1829.   ;
  1830. DefinedValue
  1831.   : ExternalValueReference
  1832.       {
  1833. $$ = new DefinedValue($1);
  1834.       }
  1835.   | IDENTIFIER
  1836.       {
  1837. $$ = new DefinedValue($1);
  1838.       }
  1839.   | ParameterizedValue
  1840.   ;
  1841. ExternalValueReference
  1842.   : MODULEREFERENCE '.' IDENTIFIER
  1843.       {
  1844. *$1 += *$3;
  1845. delete $3;
  1846.       }
  1847.   ;
  1848. ObjectIdentifierValue
  1849.   : OID_BRACE
  1850.       {
  1851.         IdentifierTokenContext = OID_IDENTIFIER;
  1852.       }
  1853.     ObjIdComponentList '}'
  1854.       {
  1855. $$ = new ObjectIdentifierValue($3);
  1856. IdentifierTokenContext = IDENTIFIER;
  1857.       }
  1858. /*!!!
  1859.   | '{' DefinedValue_OID ObjIdComponentList '}'
  1860.       {
  1861. $$ = new ObjectIdentifierValue($2);
  1862.       }
  1863. */
  1864.   ;
  1865. ObjIdComponentList
  1866.   : ObjIdComponent
  1867.       {
  1868. $$ = new PStringList;
  1869. $$->Append($1);
  1870.       }
  1871.   | ObjIdComponent ObjIdComponentList
  1872.       {
  1873. $2->InsertAt(0, $1);
  1874. $$ = $2;
  1875.       }
  1876.   ;
  1877. ObjIdComponent
  1878.   : OID_IDENTIFIER
  1879.   | INTEGER
  1880.       {
  1881. $$ = new PString(PString::Unsigned, (int)$1);
  1882.       }
  1883.   | OID_IDENTIFIER '(' NumberForm ')'
  1884.       {
  1885. delete $1;
  1886. $$ = $3;
  1887.       }
  1888.   ;
  1889. NumberForm
  1890.   : INTEGER
  1891.       {
  1892. $$ = new PString(PString::Unsigned, (int)$1);
  1893.       }
  1894.   | ExternalValueReference
  1895.   | OID_IDENTIFIER
  1896.   ;
  1897. OctetStringValue
  1898.   : OS_BSTRING
  1899.       {
  1900. $$ = new OctetStringValue($1);
  1901.       }
  1902.   | OS_HSTRING
  1903.       {
  1904. $$ = new OctetStringValue($1);
  1905.       }
  1906.   ;
  1907. BitStringValue
  1908.   : BS_BSTRING
  1909.       {
  1910. $$ = new BitStringValue($1);
  1911.       }
  1912.   | BS_HSTRING
  1913.       {
  1914. $$ = new BitStringValue($1);
  1915.       }
  1916.   | BITSTRING_BRACE BitIdentifierList '}' 
  1917.       {
  1918. $$ = new BitStringValue($2);
  1919.       }
  1920.   | BITSTRING_BRACE  '}'
  1921.       {
  1922. $$ = new BitStringValue;
  1923.       }
  1924.   ;
  1925. BitIdentifierList
  1926.   : BIT_IDENTIFIER
  1927.       {
  1928. $$ = new PStringList;
  1929.       }
  1930.   | BitIdentifierList ',' BIT_IDENTIFIER
  1931.       {
  1932. // Look up $3
  1933. $1->SetAt($1->GetSize(), 0);
  1934.       }
  1935.   ;
  1936. BooleanValue
  1937.   : TRUE_t
  1938.       {
  1939. $$ = new BooleanValue(TRUE);
  1940.       }
  1941.   | FALSE_t
  1942.       {
  1943. $$ = new BooleanValue(FALSE);
  1944.       }
  1945.   ;
  1946. CharacterStringValue
  1947.   : RestrictedCharacterStringValue
  1948. /*!!!
  1949.   | UnrestrictedCharacterStringValue
  1950. */
  1951.   ;
  1952. RestrictedCharacterStringValue
  1953.   : CSTRING
  1954.       {
  1955. $$ = new CharacterStringValue($1);
  1956.       }
  1957.   | CharacterStringList
  1958.   | Quadruple
  1959.   | Tuple
  1960.   ;
  1961. CharacterStringList
  1962.   : STRING_BRACE CharSyms '}'
  1963.       {
  1964. $$ = new CharacterStringValue($2);
  1965.       }
  1966.   ;
  1967. CharSyms
  1968.   : CharsDefn
  1969.       {
  1970. $$ = new PStringList;
  1971. $$->Append($1);
  1972.       }
  1973.   | CharSyms ',' CharsDefn
  1974.       {
  1975. $1->Append($3);
  1976.       }
  1977.   ;
  1978. CharsDefn
  1979.   : CSTRING 
  1980.   | DefinedValue
  1981.       {
  1982. PError << StdError(Warning) << "DefinedValue in string unsupported" << endl;
  1983.       }
  1984.   ;
  1985. Quadruple
  1986.   :  STRING_BRACE  INTEGER  ','  INTEGER  ','  INTEGER  ','  INTEGER '}'
  1987.       {
  1988. if ($2 != 0 || $4 != 0 || $6 > 255 || $8 > 255)
  1989.   PError << StdError(Warning) << "Illegal value in Character Quadruple" << endl;
  1990. $$ = new CharacterValue((BYTE)$2, (BYTE)$4, (BYTE)$6, (BYTE)$8);
  1991.       }
  1992.   ;
  1993. Tuple
  1994.   :  STRING_BRACE INTEGER ',' INTEGER '}'
  1995.       {
  1996. if ($2 > 255 || $4 > 255)
  1997.   PError << StdError(Warning) << "Illegal value in Character Tuple" << endl;
  1998. $$ = new CharacterValue((BYTE)$2, (BYTE)$4);
  1999.       }
  2000.   ;
  2001. ChoiceValue
  2002.   : IDENTIFIER ':' Value
  2003.       {
  2004. $3->SetValueName($1);
  2005. $$ = $3;
  2006.       }
  2007.   ;
  2008. NullValue
  2009.   : NULL_VALUE
  2010.       {
  2011. $$ = new NullValue;
  2012.       }
  2013.   ;
  2014. RealValue
  2015.   : NumericRealValue 
  2016.   | SpecialRealValue
  2017.   ;
  2018. NumericRealValue
  2019.   :  '0'
  2020.       {
  2021. $$ = new RealValue(0);
  2022.       }
  2023. /*!!!
  2024.   | SequenceValue
  2025. */
  2026.   ;
  2027. SpecialRealValue
  2028.   : PLUS_INFINITY
  2029.       {
  2030. $$ = new RealValue(0);
  2031.       }
  2032.   | MINUS_INFINITY
  2033.       {
  2034. $$ = new RealValue(0);
  2035.       }
  2036.   ;
  2037. SequenceValue
  2038.   : '{' ComponentValueList '}' 
  2039.       {
  2040. $$ = new SequenceValue($2);
  2041.       }
  2042.   | '{'  '}'
  2043.       {
  2044. $$ = new SequenceValue;
  2045.       }
  2046.   ;
  2047. ComponentValueList
  2048.   : NamedValue
  2049.       {
  2050. $$ = new ValuesList;
  2051. $$->Append($1);
  2052.       }
  2053.   | ComponentValueList ',' NamedValue
  2054.       {
  2055. $1->Append($3);
  2056.       }
  2057.   ;
  2058. NamedValue
  2059.   : IDENTIFIER Value
  2060.       {
  2061. $2->SetValueName($1);
  2062. $$ = $2;
  2063.       }
  2064.   ;
  2065. /*!!!! 
  2066. SequenceOfValue
  2067.   : '{' ValueList '}' 
  2068.       {
  2069. $$ = NULL;
  2070.       }
  2071.   | '{'  '}'
  2072.       {
  2073. $$ = NULL;
  2074.       }
  2075.   ;
  2076. ValueList
  2077.   : Value
  2078.       { }
  2079.   | ValueList ',' Value
  2080.       { }
  2081.   ;
  2082. */ 
  2083. /*!!!
  2084. ObjectClassFieldValue
  2085.   : OpenTypeFieldVal
  2086.   | Value
  2087.   ;
  2088. OpenTypeFieldVal
  2089.   : Type ':' Value
  2090.   ;
  2091. */
  2092. ReferencedValue
  2093.   : DefinedValue
  2094. /*!!!!
  2095.   | ValueFromObject
  2096. */
  2097.   ;
  2098. /*!!!!
  2099. ValueFromObject
  2100.   : ReferencedObjects '.' FieldName
  2101.     { }
  2102.   ;
  2103. */
  2104. ParameterizedValue
  2105.   : SimpleDefinedValue ActualParameterList
  2106.     { }
  2107.   ;
  2108. SimpleDefinedValue
  2109.   : ExternalValueReference
  2110.   | IDENTIFIER
  2111.   ;
  2112. /********/
  2113. ValueSet
  2114.   : '{' ElementSetSpecs '}'
  2115.   ;
  2116. /********/
  2117. MacroDefinition
  2118.   : TYPEREFERENCE MACRO ASSIGNMENT MacroSubstance
  2119.       {
  2120. PError << StdError(Warning) << "MACRO unsupported" << endl;
  2121.       }
  2122.   ;
  2123. MacroSubstance
  2124.   : BEGIN_t
  2125.       {
  2126. InMacroContext = TRUE;
  2127.       }
  2128.     MacroBody END
  2129.       {
  2130. InMacroContext = FALSE;
  2131.       }
  2132.   | TYPEREFERENCE
  2133.       {}
  2134.   | TYPEREFERENCE '.' TYPEREFERENCE
  2135.       {}
  2136.   ;
  2137. MacroBody
  2138.   : TypeProduction ValueProduction /*SupportingProductions*/
  2139.   ;
  2140. TypeProduction
  2141.   : TYPE_t NOTATION ASSIGNMENT MacroAlternativeList
  2142.   ;
  2143. ValueProduction
  2144.   : VALUE NOTATION ASSIGNMENT MacroAlternativeList
  2145.   ;
  2146. /*
  2147. SupportingProductions
  2148.   : ProductionList
  2149.   | /* empty *//*
  2150.   ;
  2151. ProductionList
  2152.   : Production
  2153.   | ProductionList Production
  2154.   ;
  2155. Production
  2156.   : TYPEREFERENCE ASSIGNMENT MacroAlternativeList
  2157.   ;
  2158. */
  2159. MacroAlternativeList
  2160.   : MacroAlternative
  2161.   | MacroAlternative '|' MacroAlternativeList
  2162.   ;
  2163. MacroAlternative
  2164.   : SymbolElement
  2165.   | SymbolElement MacroAlternative
  2166.   ;
  2167. SymbolElement
  2168.   : SymbolDefn
  2169.   | EmbeddedDefinitions
  2170.   ;
  2171. SymbolDefn
  2172.   : CSTRING
  2173.       {}
  2174.   | TYPEREFERENCE
  2175.       {}
  2176.   | TYPEREFERENCE ASSIGNMENT
  2177.       {}
  2178.   | string_t
  2179.   | identifier_t
  2180.   | number_t
  2181.   | empty_t
  2182.   | type_t
  2183.   | type_t '(' TYPE_t TYPEREFERENCE ')'
  2184.   | value_t '(' Type ')'
  2185.   | value_t '(' IDENTIFIER Type ')'
  2186.   | value_t '(' VALUE Type ')'
  2187.   ;
  2188. EmbeddedDefinitions
  2189.   : '<' EmbeddedDefinitionList '>'
  2190.   ;
  2191. EmbeddedDefinitionList
  2192.   : EmbeddedDefinition
  2193.   | EmbeddedDefinitionList EmbeddedDefinition
  2194.   ;
  2195. EmbeddedDefinition
  2196.   : LocalTypeAssignment
  2197.   | LocalValueAssignment
  2198.   ;
  2199. LocalTypeAssignment
  2200.   : TYPEREFERENCE ASSIGNMENT Type
  2201.       {}
  2202.   ;
  2203. LocalValueAssignment
  2204.   : IDENTIFIER Type ASSIGNMENT Value
  2205.       {}
  2206.   ;
  2207. /********/
  2208. ObjectTypeDefinition
  2209.   : IDENTIFIER OBJECT_TYPE
  2210.       {
  2211. InMIBContext = TRUE;
  2212.       }
  2213.     SYNTAX Type
  2214.     ACCESS ObjectTypeAccess
  2215.     STATUS ObjectTypeStatus
  2216.     MibDescrPart
  2217.     MibReferPart
  2218.     MibIndexPart
  2219.     MibDefValPart
  2220.       {
  2221. IdentifierTokenContext = OID_IDENTIFIER;
  2222.       }
  2223.     ASSIGNMENT Value
  2224.       {
  2225. Module->AddMIB(new MibObject($1, $5, (MibObject::Access)$7, (MibObject::Status)$9, $10, $11, $12, $13, $16));
  2226. InMIBContext = FALSE;
  2227. IdentifierTokenContext = IDENTIFIER;
  2228.       }
  2229.   ;
  2230. ObjectTypeAccess
  2231.   : read_only_t
  2232.       {
  2233. $$ = MibObject::read_only;
  2234.       }
  2235.   | read_write_t
  2236.       {
  2237. $$ = MibObject::read_write;
  2238.       }
  2239.   | write_only_t
  2240.       {
  2241. $$ = MibObject::write_only;
  2242.       }
  2243.   | not_accessible_t
  2244.       {
  2245. $$ = MibObject::not_accessible;
  2246.       }
  2247.   ;
  2248. ObjectTypeStatus
  2249.   : mandatory_t
  2250.       {
  2251. $$ = MibObject::mandatory;
  2252.       }
  2253.   | optional_t
  2254.       {
  2255. $$ = MibObject::optional;
  2256.       }
  2257.   | obsolete_t
  2258.       {
  2259. $$ = MibObject::obsolete;
  2260.       }
  2261.   | deprecated_t
  2262.       {
  2263. $$ = MibObject::deprecated;
  2264.       }
  2265.   ;
  2266. MibDescrPart
  2267.   : DESCRIPTION_t CSTRING
  2268.       {
  2269. $$ = $2;
  2270.       }
  2271.   | /* empty */
  2272.       {
  2273. $$ = NULL;
  2274.       }
  2275.   ;
  2276. MibReferPart
  2277.   : REFERENCE_t CSTRING
  2278.       {
  2279. $$ = $2;
  2280.       }
  2281.   | /* empty */
  2282.       {
  2283. $$ = NULL;
  2284.       }
  2285.   ;
  2286. MibIndexPart
  2287.   : INDEX_t '{' MibIndexTypes '}'
  2288.       {
  2289. $$ = $3;
  2290.       }
  2291.   | /* empty */
  2292.       {
  2293. $$ = NULL;
  2294.       }
  2295.   ;
  2296. MibIndexTypes
  2297.   : MibIndexType
  2298.       {
  2299. $$ = new PStringList;
  2300. $$->Append($1);
  2301.       }
  2302.   | MibIndexTypes ',' MibIndexType
  2303.       {
  2304. $1->Append($3);
  2305.       }
  2306.   ;
  2307. MibIndexType
  2308.   : IDENTIFIER
  2309.   | TYPEREFERENCE
  2310.   ;
  2311. MibDefValPart
  2312.   : DEFVAL_t '{' Value '}'
  2313.       {
  2314. $$ = $3;
  2315.       }
  2316.   | /* empty */
  2317.       {
  2318. $$ = NULL;
  2319.       }
  2320.   ;
  2321. TrapTypeDefinition
  2322.   : IDENTIFIER TRAP_TYPE
  2323.       {
  2324. InMIBContext = TRUE;
  2325. IdentifierTokenContext = OID_IDENTIFIER;
  2326.       }
  2327.     ENTERPRISE Value
  2328.     MibVarPart
  2329.     MibDescrPart
  2330.     MibReferPart
  2331.     ASSIGNMENT Value
  2332.       {
  2333. Module->AddMIB(new MibTrap($1, $5, $6, $7, $8, $10));
  2334. IdentifierTokenContext = IDENTIFIER;
  2335. InMIBContext = FALSE;
  2336.       }
  2337.   ;
  2338. MibVarPart
  2339.   : VARIABLES '{' MibVarTypes '}'
  2340.       {
  2341. $$ = $3;
  2342.       }
  2343.   | /* empty */
  2344.       {
  2345. $$ = NULL;
  2346.       }
  2347.   ;
  2348. MibVarTypes
  2349.   : Value
  2350.       {
  2351. $$ = new ValuesList;
  2352. $$->Append($1);
  2353.       }
  2354.   | MibVarTypes ',' Value
  2355.       {
  2356. $1->Append($3);
  2357.       }
  2358.   ;
  2359. /********/
  2360. /*!!! Not actually referenced by any other part of grammar
  2361. AbsoluteReference
  2362.   : '@' GlobalModuleReference '.' ItemSpec
  2363.   ;
  2364. ItemSpec
  2365.   : TYPEREFERENCE
  2366.   |  ItemId '.' ComponentId
  2367.   ;
  2368. ItemId
  2369.   : ItemSpec
  2370.   ;
  2371. ComponentId 
  2372.   : IDENTIFIER
  2373.   | INTEGER
  2374.   | '*'
  2375.   ;
  2376. */
  2377. Reference
  2378.   : TYPEREFERENCE
  2379.   | IDENTIFIER 
  2380.   | OBJECTCLASSREFERENCE
  2381.   | OBJECTREFERENCE
  2382.   | OBJECTSETREFERENCE
  2383.   ;
  2384. ParameterizedReference
  2385.   : Reference '{' '}'
  2386.       {
  2387. $$ = new ImportedType($1, TRUE);
  2388.       }
  2389.   ;
  2390. NamedNumberList
  2391.   : NamedNumber
  2392.       {
  2393. $$ = new NamedNumberList;
  2394. $$->Append($1);
  2395.       }
  2396.   | NamedNumberList ',' NamedNumber
  2397.       {
  2398. $1->Append($3);
  2399.       }
  2400.   ;
  2401. NamedNumber
  2402.   : IDENTIFIER '(' SignedNumber ')'
  2403.       {
  2404. $$ = new NamedNumber($1, (int)$3);
  2405.       }
  2406.   | IDENTIFIER '(' DefinedValue ')'
  2407.       {
  2408. $$ = new NamedNumber($1, ((DefinedValue*)$3)->GetReference());
  2409. delete $3;
  2410.       }
  2411.   ;
  2412. SignedNumber
  2413.   :  INTEGER 
  2414.   | '-' INTEGER
  2415.       {
  2416. $$ = -$2;
  2417.       }
  2418.   ;
  2419. /** End of File ****/