parsing object classes more properly


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1062 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y
index b070f2a..41f566d 100644
--- a/libasn1parser/asn1p_y.y
+++ b/libasn1parser/asn1p_y.y
@@ -242,9 +242,11 @@
 %type	<a_refcomp>		ComplexTypeReferenceElement
 %type	<a_refcomp>		ClassFieldIdentifier
 %type	<a_refcomp>		ClassFieldName
-%type	<a_expr>		ClassFieldList
+%type	<a_expr>		FieldSpec
+%type	<a_ref>			FieldName
+%type	<a_ref>			DefinedObjectClass
 %type	<a_expr>		ClassField
-%type	<a_expr>		ClassDeclaration
+%type	<a_expr>		ObjectClass
 %type	<a_expr>		Type
 %type	<a_expr>		DataTypeReference	/* Type1 ::= Type2 */
 %type	<a_expr>		DefinedTypeRef
@@ -747,25 +749,17 @@
 	/*
 	 * Optionally tagged type definition.
 	 */
-	TypeRefName TOK_PPEQ optTag TOK_TYPE_IDENTIFIER {
-		$$ = asn1p_expr_new(yylineno);
-		checkmem($$);
-		$$->Identifier = $1;
-		$$->tag = $3;
-		$$->expr_type = A1TC_TYPEID;
-		$$->meta_type = AMT_TYPE;
-	}
-	| TypeRefName TOK_PPEQ Type {
+	TypeRefName TOK_PPEQ Type {
 		$$ = $3;
 		$$->Identifier = $1;
 		assert($$->expr_type);
 		assert($$->meta_type);
 	}
-	| TypeRefName TOK_PPEQ ClassDeclaration {
+	| TypeRefName TOK_PPEQ ObjectClass {
 		$$ = $3;
 		$$->Identifier = $1;
 		assert($$->expr_type == A1TC_CLASSDEF);
-		assert($$->meta_type == AMT_OBJECT);
+		assert($$->meta_type == AMT_OBJECTCLASS);
 	}
 	/*
 	 * Parametrized <Type> declaration:
@@ -943,13 +937,13 @@
 	}
 	;
 
-ClassDeclaration:
-	TOK_CLASS '{' ClassFieldList '}' optWithSyntax {
+ObjectClass:
+	TOK_CLASS '{' FieldSpec '}' optWithSyntax {
 		$$ = $3;
 		checkmem($$);
 		$$->with_syntax = $5;
 		assert($$->expr_type == A1TC_CLASSDEF);
-		assert($$->meta_type == AMT_OBJECT);
+		assert($$->meta_type == AMT_OBJECTCLASS);
 	}
 	;
 
@@ -958,50 +952,111 @@
 	| TOK_UNIQUE { $$ = 1; }
 	;
 
-ClassFieldList:
+FieldSpec:
 	ClassField {
 		$$ = asn1p_expr_new(yylineno);
 		checkmem($$);
 		$$->expr_type = A1TC_CLASSDEF;
-		$$->meta_type = AMT_OBJECT;
+		$$->meta_type = AMT_OBJECTCLASS;
 		asn1p_expr_add($$, $1);
 	}
-	| ClassFieldList ',' ClassField {
+	| FieldSpec ',' ClassField {
 		$$ = $1;
 		asn1p_expr_add($$, $3);
 	}
 	;
 
+	/* X.681 */
 ClassField:
-	ClassFieldIdentifier optMarker {
+
+	/* TypeFieldSpec ::= typefieldreference TypeOptionalitySpec? */
+	TOK_typefieldreference optMarker {
 		$$ = asn1p_expr_new(yylineno);
 		checkmem($$);
-		$$->Identifier = $1.name;
-		$$->expr_type = A1TC_CLASSFIELD;
+		$$->Identifier = $1;
 		$$->meta_type = AMT_OBJECTFIELD;
+		$$->expr_type = A1TC_CLASSFIELD_TFS;	/* TypeFieldSpec */
 		$$->marker = $2;
 	}
-	| ClassFieldIdentifier Type optUnique optMarker {
-		$$ = $2;
-		$$->Identifier = $1.name;
-		$$->marker = $4;
+
+	/* FixedTypeValueFieldSpec ::= valuefieldreference Type UNIQUE ? ValueOptionalitySpec ? */
+	| TOK_valuefieldreference Type optUnique optMarker {
+		$$ = asn1p_expr_new(yylineno);
+		$$->Identifier = $1;
+		$$->meta_type = AMT_OBJECTFIELD;
+		$$->expr_type = A1TC_CLASSFIELD_FTVFS;	/* FixedTypeValueFieldSpec */
 		$$->unique = $3;
+		$$->marker = $4;
+		asn1p_expr_add($$, $2);
 	}
-	| ClassFieldIdentifier ClassFieldIdentifier optUnique optMarker {
-		int ret;
+
+	/* VariableTypeValueFieldSpec ::= valuefieldreference FieldName ValueOptionalitySpec ? */
+	| TOK_valuefieldreference FieldName optMarker {
+		$$ = asn1p_expr_new(yylineno);
+		$$->Identifier = $1;
+		$$->meta_type = AMT_OBJECTFIELD;
+		$$->expr_type = A1TC_CLASSFIELD_VTVFS;
+		$$->reference = $2;
+		$$->marker = $3;
+	}
+
+	/* VariableTypeValueSetFieldSpec ::= valuesetfieldreference FieldName ValueOptionalitySpec ? */
+	| TOK_typefieldreference FieldName optMarker {
+		$$ = asn1p_expr_new(yylineno);
+		$$->Identifier = $1;
+		$$->meta_type = AMT_OBJECTFIELD;
+		$$->expr_type = A1TC_CLASSFIELD_VTVSFS;
+		$$->reference = $2;
+		$$->marker = $3;
+	}
+
+	/*  ObjectFieldSpec ::= objectfieldreference DefinedObjectClass ObjectOptionalitySpec ? */
+	| TOK_valuefieldreference DefinedObjectClass optMarker {
 		$$ = asn1p_expr_new(yylineno);
 		checkmem($$);
-		$$->Identifier = $1.name;
-		$$->reference = asn1p_ref_new(yylineno);
-		checkmem($$->reference);
-		ret = asn1p_ref_add_component($$->reference,
-				$2.name, $2.lex_type);
-		checkmem(ret == 0);
-		$$->expr_type = A1TC_CLASSFIELD;
+		$$->Identifier = $1;
+		$$->reference = $2;
 		$$->meta_type = AMT_OBJECTFIELD;
-		$$->marker = $4;
-		$$->unique = $3;
+		$$->expr_type = A1TC_CLASSFIELD_OFS;
+		$$->marker = $3;
 	}
+
+	/*  ObjectSetFieldSpec ::= objectsetfieldreference DefinedObjectClass ObjectOptionalitySpec ? */
+	| TOK_typefieldreference DefinedObjectClass optMarker {
+		$$ = asn1p_expr_new(yylineno);
+		checkmem($$);
+		$$->Identifier = $1;
+		$$->reference = $2;
+		$$->meta_type = AMT_OBJECTFIELD;
+		$$->expr_type = A1TC_CLASSFIELD_OSFS;
+		$$->marker = $3;
+	}
+
+	/* FixedTypeValueSetFieldSpec ::= valuesetfieldreference Type ValueSetOptionalitySpec ? */
+	| TOK_typefieldreference Type optMarker {
+		$$ = asn1p_expr_new(yylineno);
+		checkmem($$);
+		$$->Identifier = $1;
+		$$->meta_type = AMT_OBJECTFIELD;
+		$$->expr_type = A1TC_CLASSFIELD_FTVSFS;
+		asn1p_expr_add($$, $2);
+		$$->marker = $3;
+	}
+
+	/*
+	DefinedObjectClass:
+		TOK_capitalreference {
+			$$ = asn1p_ref_new(yylineno);
+			asn1p_ref_add_component($$, $1, RLT_CAPITALS);
+		}
+		| TypeRefName '.' TOK_capitalreference {
+			$$ = asn1p_ref_new(yylineno);
+			asn1p_ref_add_component($$, $1, RLT_AmpUppercase);
+			asn1p_ref_add_component($$, $3, RLT_CAPITALS);
+		}
+		;
+	*/
+
 	;
 
 optWithSyntax:
@@ -1333,6 +1388,35 @@
 	;
 
 
+FieldName:
+	/* "&Type1" */
+	TOK_typefieldreference {
+		$$ = asn1p_ref_new(yylineno);
+		asn1p_ref_add_component($$, $1, RLT_AmpUppercase);
+	}
+	| FieldName '.' TOK_typefieldreference {
+		$$ = $$;
+		asn1p_ref_add_component($$, $3, RLT_AmpUppercase);
+	}
+	| FieldName '.' TOK_valuefieldreference {
+		$$ = $$;
+		asn1p_ref_add_component($$, $3, RLT_Amplowercase);
+	}
+	;
+
+DefinedObjectClass:
+	TOK_capitalreference {
+		$$ = asn1p_ref_new(yylineno);
+		asn1p_ref_add_component($$, $1, RLT_CAPITALS);
+	}
+	| TypeRefName '.' TOK_capitalreference {
+		$$ = asn1p_ref_new(yylineno);
+		asn1p_ref_add_component($$, $1, RLT_AmpUppercase);
+		asn1p_ref_add_component($$, $3, RLT_CAPITALS);
+	}
+	;
+
+
 /*
  * === EXAMPLE ===
  * value INTEGER ::= 1