ANSI Doc No: X3J16/93-0065 ISO Doc No: WG21/N0272 Date: June 22, 1993 Project: Programming Language C++ Ref Doc: Reply To: Eric J. Krohn krohn@bae.bellcore.com +1 908 699-2708 Replacing Context Dependent Keywords by type-name 1. Abstract The C++ grammar in the working paper uses context dependent keywords (18.1p1) in several places. These context dependent keywords are: class-name, enum-name, and typedef-name. This paper proposes simplifying the grammar by replacing these non- terminals with type-name where appropriate. 2. The Current Syntax The current grammar rules relevant to context dependent keywords are shown in Appendix I. 3. Proposal 1 - Add missing type specifiers Studying the grammar reveals some deficiencies, namely: o enum-name is not valid as a type-specifier. o ::enum-name is not valid as a type-specifier. In fact, no qualified form of enum-name is valid in type-specifier. o ::typedef-name is not valid as a simple-type-specifier (whereas ::class-name is). Making these changes affects the following rules: type-specifier: simple-type-specifier class-specifier enum-specifier elaborated-type-specifier DELETED :: typedef-name const volatile qualified-enum-specifier: enum-name class-name :: qualified-enum-specifier simple-type-specifier: qualified-class-specifier ::(opt) qualified-type-specifier ::(opt) qualified-enum-specifier June 22, 1993 Page 2 X3J16/93-0065 WG21/N0272 char short int long signed unsigned float double void 4. Proposal 2 - Consolidation with type-name The nonterminal class-name is specifically required before :: and after ~ (destructors). In other places, what matters is not whether a name is specifically a a typedef-name, or an enum-name, or a class-name but whether it is some kind of type name. Hence, I propose substituting the new nonterminal type-name for the other nonterminals wherever possible. Making these changes affects the following rules: type-name: class-name enum-name typedef-name declarator-id: id-expression ~ class-name qualified-type-name-specifier simple-type-specifier: ::(opt) qualified-type-name-specifier char short int long signed unsigned float double void DELETED qualified-enum-specifier: DELETED enum-name DELETED class-name :: qualified-enum-specifier DELETED qualified-type-specifier: DELETED typedef-name DELETED class-name :: qualified-type-specifier qualified-type-name-specifier: type-name class-name :: qualified-type-name-specifier June 22, 1993 Page 3 X3J16/93-0065 WG21/N0272 June 22, 1993 Page 4 X3J16/93-0065 WG21/N0272 Appendix I - Original Grammar Rules class-name: identifier template-class-id enum-name: identifier typedef-name: identifier qualified-id: nested-class-specifier :: id-expression type-specifier: simple-type-specifier class-specifier enum-specifier elaborated-type-specifier :: typedef-name const volatile simple-type-specifier: qualified-class-specifier qualified-type-specifier char wchar_t short int long signed unsigned float double void qualified-type-specifier: typedef-name class-name :: qualified-type-specifier qualified-class-specifier: nested-class-specifier :: nested-class-specifier nested-class-specifier: class-name class-name :: nested-class-specifier declarator-id: id-expression qualified-type-specifier June 22, 1993 Page 5 X3J16/93-0065 WG21/N0272 Appendix II - Grammar Rules after Proposal 1 class-name: identifier template-class-id enum-name: identifier typedef-name: identifier qualified-id: nested-class-specifier :: id-expression type-specifier: simple-type-specifier class-specifier enum-specifier elaborated-type-specifier DELETED :: typedef-name const volatile qualified-enum-specifier: enum-name class-name :: qualified-enum-specifier simple-type-specifier: qualified-class-specifier ::(opt) qualified-type-specifier ::(opt) qualified-enum-specifier char short int long signed unsigned float double void qualified-type-specifier: typedef-name class-name :: qualified-type-specifier qualified-class-specifier: nested-class-specifier :: nested-class-specifier nested-class-specifier: class-name class-name :: nested-class-specifier declarator-id: id-expression qualified-type-specifier June 22, 1993 Page 6 X3J16/93-0065 WG21/N0272 Appendix III - Grammar Rules after Proposal 2 class-name: identifier template-class-id enum-name: identifier typedef-name: identifier type-name: class-name enum-name typedef-name qualified-id: nested-class-specifier :: id-expression type-specifier: simple-type-specifier class-specifier enum-specifier elaborated-type-specifier DELETED :: typedef-name const volatile simple-type-specifier: ::(opt) qualified-type-name-specifier char short int long signed unsigned float double void qualified-class-specifier: nested-class-specifier :: nested-class-specifier qualified-type-name-specifier: type-name class-name :: qualified-type-name-specifier nested-class-specifier: class-name class-name :: nested-class-specifier declarator-id: id-expression ~ class-name qualified-type-name-specifier