/* yacc.y - yacc ASN.1 parser */
static char *rcsid = "$Header: /f/osi/pepy/RCS/yacc.y.gnrc,v 7.6 91/03/09 11:55:13 mrose Exp $";
* $Header: /f/osi/pepy/RCS/yacc.y.gnrc,v 7.6 91/03/09 11:55:13 mrose Exp $
* Revision 7.6 91/03/09 11:55:13 mrose
* Revision 7.5 91/02/22 09:35:23 mrose
* Revision 7.4 90/12/23 18:42:25 mrose
* Revision 7.3 90/11/21 11:32:27 mrose
* Revision 7.2 90/11/20 15:31:37 mrose
* Revision 7.1 90/09/07 17:34:35 mrose
* Revision 7.0 90/07/01 19:54:39 mrose
* *** empty log message ***
* Revision 7.1 90/05/21 17:08:28 mrose
* Revision 7.0 89/11/23 22:12:10 mrose
* Acquisition, use, and distribution of this module and related
* materials are subject to the restrictions of a license agreement.
* Consult the Preface in the User's Manual for the full terms of
#define YYSTYPE YYSTKTYPE
int tagcontrol = TAG_UNKNOWN;
static int yyporting = 0;
static YA new_action (text, lineno)
if ((ya = (YA) calloc (1, sizeof *ya)) == NULLYA)
yyerror ("out of memory");
ya -> ya_lineno = lineno;
#define free_action(ya) (void) free ((char *) (ya))
if((ys = (YS) malloc (sizeof *ys)) == NULLYS)
yyerror ("out of memory");
while (isspace ((u_char)*q)) q++;
for (p = q; isalnum((u_char)*p) || *p == '_'; p++)
ys -> ys_structname = new_string (q);
ys -> ys_structname = new_string (q);
ys -> ys_ptrname = NULLCP;
for (q = p; *q != '$'; q++)
ys -> ys_ptrname = NULLCP;
while (isspace ((u_char)*q)) q++;
for (p = q; isalnum((u_char)*p) || *p == '_'; p++)
ys -> ys_ptrname = new_string (q);
#define free_ys(ys) (void) free ((char *) (ys))
static int final_actions = 0;
%token ABSENT ACTION ANY APPLICATION BAR BGIN BIT BITSTRING BOOLEAN
BY CCE CHOICE COMMA COMPONENT COMPONENTS COMPONENTSOF CONTROL
DECODER DEFAULT DEFINED DEFINITIONS DOT DOTDOT DOTDOTDOT
ENCODER ENCRYPTED END ENUMERATED EXPORTS EXPLICIT FALSE FROM
ID IDENTIFIER IMPLICIT IMPORTS INCLUDES INTEGER LANGLE LBRACE
LBRACKET LITNUMBER LITSTRING LPAREN MIN MAX NAME NIL OBJECT
OCTET OCTETSTRING OF OPTIONAL PARAMETERTYPE PREFIXES PRESENT
PRINTER PRIVATE RBRACE RBRACKET REAL RPAREN SECTIONS SEMICOLON
SEQUENCE SEQUENCEOF SET SETOF SIZE STRING TAGS TRUE UNIVERSAL
VALA VALB VALI VALS VALP VALO VALOID VALR VALQ VALX VLENGTH
WITH SCTRL PLUSINFINITY MINUSINFINITY
OPERATION ARGUMENT RESULT ERRORS LINKED ERROR PARAMETER
ABSTRACT OPERATIONS CONSUMER SUPPLIER INVOKES PORT PORTS
OBJECTCONSUMER OBJECTSUPPLIER REFINE AS RECURRING VISIBLE
OBJECTYPE SYNTAX ACCESS STATUS DESCRIPTION REFERENCE INDEX DEFVAL
TRAPTYPE ENTERPRISE VARIABLES
%type <yy_number> LITNUMBER
%type <yy_real> RealValue NumericRealValue SpecialRealValue
%type <yy_string> ID NAME LITSTRING VALA VALB VALI VALS VALP VALQ
VALR VALO VALX VLENGTH VALOID CONTROL PARAMETERTYPE
ParameterType Control ValParameter String
PassInt PassBool PassOid PassAny PassReal
ModuleIdentifier Symbol SymbolList
%type <yy_type> Type BuiltinType DefinedType PassValue PassBit
PassString NullPass ElementTypes OptionalTypeList
OptionalType NamedType ComponentsOf AlternativeTypeList
Argument Result Parameter
%type <yy_value> NamedNumberList NamedNumber NumericValue
Value BuiltinValue DefinedValue IdentifierList
Values NamedValueList NamedValue NNlist
LinkedOperations LinkedOperationNames
ObjectID ObjectIDComponentList ObjectSubID
IndexPart IndexTypes IndexType
%type <yy_action> ACTION Action
%type <yy_oid> ObjIdComponentList ObjectIdentifierValue
ObjIdComponent NumberForm NameAndNumberForm
ModuleDefinition: ModuleIdentifier DEFINITIONS TagDefault CCE
ModuleActions ModulePrefixes
BGIN ModuleBody END { pass2 (); final_actions++; }
TagDefault: EXPLICIT TAGS {
tagcontrol = TAG_EXPLICIT;
tagdefault = YP_IMPLICIT;
tagcontrol = TAG_IMPLICIT;
tagcontrol = TAG_UNKNOWN;
ModuleIdentifier: ID AssignedIdentifier { $$ = $1; }
AssignedIdentifier: ObjectIdentifierValue { modid = $1; }
module_actions = $1 -> ya_text;
module_actions = $1 -> ya_text;
printf ("# line %d \"%s\"\n",
fputs ($1 -> ya_text, stdout);
printf ("%%{\n#include \"%s-types.h\"\n",
printf ("%s%%}\n", $1 -> ya_text);
PREFIXES String String String
ModuleBody: Exports Imports AssignmentList
Exports: EXPORTS { listtype = TBL_EXPORT; doexternals = 0;
SymbolsExported SEMICOLON {
if (mymoduleid == NULLOID)
warning ("EXPORTS but no ModuleIdentifier");
SymbolsExported: SymbolList
Imports: IMPORTS { listtype = TBL_IMPORT; yyporting = 1; }
SymbolsImported SEMICOLON {
if (mymoduleid == NULLOID)
warning ("IMPORTS but no ModuleIdentifier");
SymbolsImported: SymbolsFromModuleList
SymbolsFromModuleList: SymbolsFromModuleList SymbolsFromModule
SymbolsFromModule: SymbolList FROM ModuleIdentifier
addtableref ($3, modid, listtype);
SymbolList: SymbolList COMMA Symbol { addtable($3, listtype); }
| Symbol { addtable ($1, listtype); }
AssignmentList: AssignmentList Section Assignment
{ yysection = YP_ENCODER; yyencpref = $2;
yyprint (NULLCP, 0, 1); }
{ yysection = YP_DECODER; yydecpref = $2;
yyprint (NULLCP, 0, 1); }
{ yysection = YP_PRINTER; yyprfpref = $2;
yyprint (NULLCP, 0, 1); }
| SECTIONS String String String
if (strcmp (yyencpref = $2, "none"))
if (strcmp (yydecpref = $3, "none"))
if (strcmp (yyprfpref = $4, "none"))
Assignment: Typeassignment
/* | RefineDefinition -- impossible!!!! (JPO) */
/* | BindDefinition -- lacking defs... */
/* | UnBindDefinition -- ditto */
OperationDefinition: NAME OPERATION Argument Result Errors LinkedOperations
pass1_op (mymodule, $1, $3, $4, $5, $6, $8);
Argument: ARGUMENT NamedType { $$ = $2; }
Result: RESULT NamedType { $$ = $2; }
Errors: ERRORS LBRACE ErrorNames RBRACE { $$ = $3; }
LinkedOperations: LINKED LBRACE LinkedOperationNames RBRACE { $$ = $3; }
ErrorNames: NamedValueList {
$$ = new_value (YV_VALIST);
LinkedOperationNames: NamedValueList {
$$ = new_value (YV_VALIST);
ErrorDefinition: NAME ERROR Parameter CCE LITNUMBER {
pass1_err (mymodule, $1, $3, $5);
Parameter: PARAMETER NamedType { $$ = $2; }
PortDefinition: NAME PORT PortOperations CCE PortValue
PortValue: ObjectIdentifierValue
PortOperations: PortSymmetrical
PortSymmetrical: ABSTRACT OPERATIONS LBRACE PortOperationList RBRACE
PortAsymetrical: PortOneSided
PortOneSided: PortConsumer
PortTwoSided: PortConsumer PortSupplier
| PortSupplier PortConsumer
PortConsumer: CONSUMER INVOKES LBRACE PortOperationList RBRACE
PortSupplier: SUPPLIER INVOKES LBRACE PortOperationList RBRACE
PortOperationList: OperationValue
| OperationValue COMMA PortOperationList
ObjectDefinition: NAME OBJECT ObjectType CCE PortValue
ObjectType: PORTS LBRACE ObjectPortList RBRACE
ObjectPortList: ObjectPort COMMA ObjectPortList
ObjectPort: PortValue ObjectPortType
ObjectPortType: ObjectSymetric
ObjectAsymetric: OBJECTCONSUMER
ObjectTypeDefinition: NAME OBJECTYPE SYNTAX NamedType ACCESS NAME
STATUS NAME DescrPart ReferPart IndexPart DefValPart
pass1_obj (mymodule, $1, $4, $14, $6, $8,
ObjectIDefinition: NAME OBJECT IDENTIFIER CCE ObjectID {
pass1_oid (mymodule, $1, $5);
$$ = new_value (YV_OIDLIST);
$$ -> yv_idlist = new_value (YV_IDEFINED);
$$ -> yv_idlist -> yv_identifier = $1;
$$ -> yv_idlist -> yv_flags |= YV_BOUND;
| LBRACE ObjectIDComponentList RBRACE {
$$ = new_value (YV_OIDLIST);
ObjectIDComponentList: ObjectSubID { $$ = $1; }
| ObjectIDComponentList ObjectSubID {
$$ = new_value (YV_NUMBER);
$$ = new_value (YV_IDEFINED);
$$ -> yv_identifier = $1;
$$ -> yv_flags |= YV_BOUND;
| NAME LPAREN LITNUMBER RPAREN {
$$ = new_value (YV_NUMBER);
$$ -> yv_flags |= YV_NAMED;
DescrPart: DESCRIPTION LITSTRING { $$ = $2; }
ReferPart: REFERENCE LITSTRING { $$ = $2; }
IndexPart: INDEX LBRACE IndexTypes RBRACE {
$$ = new_value (YV_VALIST);
IndexTypes: IndexType { $$ = $1; }
| IndexTypes COMMA IndexType {
IndexType: ObjectID { $$ = $1; }
| INTEGER { $$ = new_value (YV_NUMBER); }
| Octetstring { $$ = new_value (YV_STRING); }
| OBJECT IDENTIFIER { $$ = new_value (YV_OIDLIST); }
$$ = new_value (YV_IDEFINED);
$$ -> yv_identifier = $1;
DefValPart: DEFVAL LBRACE Value RBRACE { $$ = $3; }
TrapTypeDefinition: NAME TRAPTYPE ENTERPRISE ObjectID VarPart DescrPart
ReferPart CCE LITNUMBER {
pass1_trap (mymodule, $1, $4, $9, $5, $6, $7);
VarPart: VARIABLES LBRACE VarTypes RBRACE {
$$ = new_value (YV_VALIST);
VarTypes: VarType { $$ = $1; }
| VarTypes COMMA VarType {
$$ = new_value (YV_IDEFINED);
$$ -> yv_identifier = $1;
Typeassignment: ID ParameterType Action CCE Action Type {
$6 -> yp_param_type = $2;
$6 -> yp_action0 = $3 -> ya_text;
$6 -> yp_act0_lineno= $3 -> ya_lineno;
if ($6 -> yp_action05 == NULLCP) {
$6 -> yp_action05 = $5 -> ya_text;
$6 -> yp_act05_lineno= $5 -> ya_lineno;
yyerror("too many preliminary actions associated with type");
pass1_type (yyencpref, yydecpref, yyprfpref,
Type: BuiltinType Action {
$$ -> yp_direction = yysection;
$$ -> yp_action2 = $2 -> ya_text;
$$ -> yp_act2_lineno= $2 -> ya_lineno;
$$ -> yp_direction = yysection;
$$ -> yp_action2 = $2 -> ya_text;
$$ -> yp_act2_lineno= $2 -> ya_lineno;
$$ -> yp_direction = yysection;
$$ -> yp_action2 = $2 -> ya_text;
$$ -> yp_act2_lineno = $2 -> ya_lineno;
ParameterType: PARAMETERTYPE
BuiltinType: BOOLEAN PassBool {
| INTEGER PassInt NNlist {
$$ = new_type ($3 ? YP_INTLIST : YP_INT);
| ENUMERATED PassInt LBRACE NamedNumberList RBRACE {
$$ = new_type (YP_ENUMLIST);
| Bitstring PassBit NNlist {
$$ -> yp_code = $3 ? YP_BITLIST: YP_BIT;
| Octetstring PassString {
| NIL { $$ = new_type (YP_NULL); }
| SEQUENCE Sctrl PassAny {
| SequenceOf Sctrl Action Control Type {
$$ = new_type (YP_SEQTYPE);
$$ -> yp_structname = $2 -> ys_structname;
$$ -> yp_ptrname = $2 -> ys_ptrname;
$$ -> yp_flags |= YP_CONTROLLED;
$$ -> yp_action3 = $3 -> ya_text;
$$ -> yp_act3_lineno = $3 -> ya_lineno;
| SEQUENCE Sctrl Action LBRACE ElementTypes RBRACE {
$$ = new_type (YP_SEQLIST);
$$ -> yp_structname = $2 -> ys_structname;
$$ -> yp_ptrname = $2 -> ys_ptrname;
if ($3 && $$ -> yp_action1 == NULLCP) {
$$ -> yp_action1 = $3 -> ya_text;
$$ -> yp_act1_lineno = $3 -> ya_lineno;
yyerror("too many actions associated with SEQUENCE");
| SetOf Sctrl Action Control Type {
$$ = new_type (YP_SETTYPE);
$$ -> yp_structname = $2 -> ys_structname;
$$ -> yp_ptrname = $2 -> ys_ptrname;
$$ -> yp_flags |= YP_CONTROLLED;
$$ -> yp_action3 = $3 -> ya_text;
$$ -> yp_act3_lineno = $3 -> ya_lineno;
| SET Sctrl Action LBRACE MemberTypes RBRACE {
$$ = new_type (YP_SETLIST);
$$ -> yp_structname = $2 -> ys_structname;
$$ -> yp_ptrname = $2 -> ys_ptrname;
if ($3 && $$ -> yp_action1 == NULLCP) {
$$ -> yp_action1 = $3 -> ya_text;
$$ -> yp_act1_lineno = $3 -> ya_lineno;
yyerror("too many actions associated with SET");
| Tag Action IMPLICIT Type {
if ($2 && $$ -> yp_action1 == NULLCP) {
$$ -> yp_action1 = $2 -> ya_text;
$$ -> yp_act1_lineno= $2 -> ya_lineno;
yyerror("too many actions associated with tagged type");
$$ -> yp_flags |= YP_IMPLICIT | YP_TAG;
| Tag Action EXPLICIT Type {
if ($2 && $$ -> yp_action1 == NULLCP) {
$$ -> yp_action1 = $2 -> ya_text;
$$ -> yp_act1_lineno= $2 -> ya_lineno;
yyerror("too many actions associated with tagged type");
$$ -> yp_flags |= YP_TAG;
if ($2 && $$ -> yp_action1 == NULLCP) {
$$ -> yp_action1 = $2 -> ya_text;
$$ -> yp_act1_lineno= $2 -> ya_lineno;
yyerror("too many actions associated with tagged type");
$$ -> yp_flags |= (YP_TAG | tagdefault);
| CHOICE Sctrl Action Control LBRACE
AlternativeTypeList RBRACE {
$$ = new_type (YP_CHOICE);
$$ -> yp_structname = $2 -> ys_structname;
$$ -> yp_ptrname = $2 -> ys_ptrname;
$$ -> yp_flags |= YP_CONTROLLED;
if ($$ -> yp_action1 == NULLCP && $3) {
$$ -> yp_action1 = $3 -> ya_text;
$$ -> yp_act1_lineno = $3 -> ya_lineno;
yyerror("too many actions associated with CHOICE");
$$ -> yp_flags |= YP_BOUND;
| OBJECT IDENTIFIER PassOid {
$$ -> yp_tag = new_tag (PE_CLASS_UNIV);
$$ -> yp_tag -> yt_value = new_value(YV_NUMBER);
$$ -> yp_tag -> yt_value -> yv_number = PE_PRIM_ENCR;
(YP_ENCRYPTED | YP_TAG | YP_IMPLICIT);
NNlist: LBRACE NamedNumberList RBRACE { $$ = $2; }
DefinedType: ID PassValue ValParameter {
$$ -> yp_code = YP_IDEFINED;
$$ -> yp_identifier = $1;
$$ -> yp_flags |= YP_PARMVAL;
| ID DOT ID PassValue ValParameter {
$$ -> yp_code = YP_IDEFINED;
$$ -> yp_identifier = $3;
$$ -> yp_flags |= YP_PARMVAL;
$$ -> yp_intexp = NULLCP;
$$ -> yp_strexp = NULLCP;
$$ -> yp_strexp = NULLCP;
$$ -> yp_intexp = NULLCP;
$$ -> yp_intexp = NULLCP;
$$ -> yp_intexp = NULLCP;
$$ -> yp_intexp = NULLCP;
$$ -> yp_strexp = NULLCP;
NamedNumberList: NamedNumber { $$ = $1; }
| NamedNumberList COMMA NamedNumber {
NamedNumber: NAME LPAREN NumericValue RPAREN Action {
$$ -> yv_flags |= YV_NAMED;
$$ -> yv_action = $5 -> ya_text;
$$ -> yv_act_lineno = $5 -> ya_lineno;
NumericValue: LITNUMBER {
$$ = new_value (YV_NUMBER);
ElementTypes: OptionalTypeList { $$ = $1; }
MemberTypes: OptionalTypeList { $$ = $1; }
OptionalTypeList: OptionalType { $$ = $1; }
| OptionalTypeList COMMA OptionalType {
OptionalType: NamedType { $$ = $1; }
| NamedType OPTIONAL Control {
$$ -> yp_flags |= YP_OPTIONAL;
$$ -> yp_optcontrol = $3;
$$ -> yp_flags |= YP_OPTCONTROL;
| NamedType DEFAULT Value Control {
$$ -> yp_flags |= YP_DEFAULT;
$$ -> yp_optcontrol = $4;
$$ -> yp_flags |= YP_OPTCONTROL;
| ComponentsOf { $$ = $1; }
| NAME ComponentsOf { $$ = $2; $$->yp_id = $1; }
NamedType: NAME Action Type {
if ($$ -> yp_action1 == NULLCP && $2) {
$$ -> yp_action1 = $2 -> ya_text;
$$ -> yp_act1_lineno = $2 -> ya_lineno;
ComponentsOf: Components Type {
$$ -> yp_flags |= YP_COMPONENTS;
AlternativeTypeList: NamedType { $$ = $1; }
| AlternativeTypeList COMMA NamedType {
Tag: LBRACKET Class NumericValue RBRACKET {
Class: UNIVERSAL { $$ = new_tag (PE_CLASS_UNIV); }
| APPLICATION { $$ = new_tag (PE_CLASS_APPL); }
| PRIVATE { $$ = new_tag (PE_CLASS_PRIV); }
| empty { $$ = new_tag (PE_CLASS_CONT); }
Valueassignment: NAME Type CCE Value
$$ = new_value (YV_BOOL);
$$ = new_value (YV_BOOL);
$$ = new_value (YV_NUMBER);
| LBRACE ID IdentifierList RBRACE {
$$ = new_value (YV_IDLIST);
$$ -> yv_idlist = new_value (YV_IDEFINED);
$$ -> yv_idlist -> yv_identifier = $2;
$$ = new_value (YV_STRING);
| NIL { $$ = new_value (YV_NULL); }
$$ = new_value (YV_VALIST);
$$ -> yv_flags |= YV_TYPE;
$$ = new_value (YV_REAL);
RealValue: NumericRealValue
SpecialRealValue: PLUSINFINITY { $$ = PE_REAL_INFINITY;}
| MINUSINFINITY { $$ = - PE_REAL_INFINITY; }
NumericRealValue: LBRACE LITNUMBER COMMA LITNUMBER COMMA
myyerror ("Illegal base value %d", $4);
$$ = $2 * pow ((double)$4, (double)$6);
$$ = new_value (YV_IDEFINED);
$$ -> yv_identifier = $1;
$$ = new_value (YV_IDEFINED);
$$ -> yv_identifier = $1;
$$ -> yv_flags |= YV_BOUND;
$$ = new_value (YV_IDEFINED);
$$ -> yv_identifier = $3;
IdentifierList: IdentifierList COMMA ID {
$$ = new_value (YV_IDEFINED);
$$ -> yv_identifier = $3;
Values: NamedValueList { $$ = $1; }
NamedValueList: NamedValue { $$ = $1; }
| NamedValueList COMMA NamedValue {
NamedValue: Value { $$ = $1; }
Octetstring: OCTET STRING
ObjectIdentifierValue: LBRACE ObjIdComponentList RBRACE
ObjIdComponentList: ObjIdComponent
| ObjIdComponentList ObjIdComponent
ObjIdComponent: NumberForm
NumberForm: LITNUMBER { $$ = int2oid ($1); }
$$ = oidlookup($1->yv_identifier);
NameAndNumberForm: NAME LPAREN NumberForm RPAREN {
SubType: Type SubtypeSpec
| SET SizeConstraint OF Sctrl Action Control Type {
$$ = new_type (YP_SETTYPE);
$$ -> yp_structname = $4 -> ys_structname;
$$ -> yp_ptrname = $4 -> ys_ptrname;
$$ -> yp_flags |= YP_CONTROLLED;
$$ -> yp_action3 = $5 -> ya_text;
$$ -> yp_act2_lineno = $5 -> ya_lineno;
| SEQUENCE SizeConstraint OF Sctrl Action Control Type {
$$ = new_type (YP_SEQTYPE);
$$ -> yp_structname = $4 -> ys_structname;
$$ -> yp_ptrname = $4 -> ys_ptrname;
$$ -> yp_flags |= YP_CONTROLLED;
$$ -> yp_action3 = $5 -> ya_text;
$$ -> yp_act3_lineno = $5 -> ya_lineno;
SubtypeSpec: LPAREN SubtypeAlternative SubtypeAlternativeList RPAREN
SubtypeAlternative: SubtypeValueSet
SubtypeAlternativeList: BAR SubtypeAlternative SubtypeAlternativeList
SubtypeConstraint: SizeConstraint
ContainedSubType: INCLUDES Type ;
ValueRange: LowerEndPoint DOTDOT UpperEndpoint
LowerEndPoint: LowerEndValue
UpperEndpoint: UpperEndValue
SizeConstraint: SIZE SubtypeSpec
PermittedAlphabet: FROM SubtypeSpec
InnerTypeConstraint: WITH COMPONENT SingleTypeConstraint
| WITH COMPONENTS MultipleTypeConstraints
SingleTypeConstraint: SubtypeSpec
MultipleTypeConstraints:FullSpecification
FullSpecification: LBRACE TypeConstraints RBRACE
PartialSpecification: LBRACE DOTDOTDOT COMMA TypeConstraints RBRACE
TypeConstraints: NamedConstraint
| NamedConstraint COMMA TypeConstraints
NamedConstraint: NAME Constraint
Constraint: ValueConstraint
ValueConstraint: SubtypeSpec
PresenceConstraint: PRESENT
Sctrl: SCTRL { $$ = new_ys ($1); }