Skip to content

Commit

Permalink
Merge pull request #775 from Hackerpilot/issue-10285
Browse files Browse the repository at this point in the history
Issue 10285 - Enum grammar documentation is incorrect
  • Loading branch information
9rnsr committed Jan 18, 2015
2 parents 3444368 + 5cc9f17 commit d054391
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 45 deletions.
58 changes: 30 additions & 28 deletions enum.dd
Expand Up @@ -4,44 +4,47 @@ $(SPEC_S Enums,

$(GRAMMAR
$(GNAME EnumDeclaration):
$(D enum) $(GLINK EnumTag) $(GLINK EnumBody)
$(D enum) $(GLINK EnumBody)
$(D enum) $(GLINK EnumTag) $(D :) $(GLINK EnumBaseType) $(GLINK EnumBody)
$(D enum) $(D :) $(GLINK EnumBaseType) $(GLINK EnumBody)

$(GNAME EnumTag):
$(I Identifier)
$(D enum) $(I Identifier) $(GLINK EnumBody)
$(D enum) $(I Identifier) $(D :) $(GLINK EnumBaseType) $(GLINK EnumBody)
$(AnonymousEnumDeclaration)

$(GNAME EnumBaseType):
$(GLINK2 declaration, Type)

$(GNAME EnumBody):
$(GLINK EmptyEnumBody)
$(GLINK EnumMembersBody)

$(GNAME EmptyEnumBody):
$(D ;)

$(GNAME EnumMembersBody):
$(D {) $(GLINK EnumMembers) $(D })
$(D ;)

$(GNAME EnumMembers):
$(GLINK EnumMember)
$(GLINK EnumMember) $(D ,)
$(GLINK EnumMember) $(D ,) $(I EnumMembers)
$(GLINK EnumMember) $(D ,) $(GLINK EnumMembers)

$(GNAME EnumMember):
$(I Identifier)
$(I Identifier) $(D =) $(ASSIGNEXPRESSION)
$(GLINK2 declaration, Type) $(I Identifier) $(D =) $(ASSIGNEXPRESSION)

$(GNAME AnonymousEnumDeclaration):
$(D enum) $(D :) $(GLINK EnumBaseType) $(D {) $(GLINK EnumMembers) $(D })
$(D enum) $(D {) $(GLINK EnumMembers) $(D })
$(D enum) $(D {) $(GLINK AnonymousEnumMembers) $(D })

$(GNAME AnonymousEnumMembers):
$(GLINK AnonymousEnumMember)
$(GLINK AnonymousEnumMember) $(D ,)
$(GLINK AnonymousEnumMember) $(D ,) $(GLINK AnonymousEnumMembers)

$(GNAME AnonymousEnumMember):
$(GLINK EnumMember)
$(GLINK2 declaration Type) $(I Identifier) $(D =) $(ASSIGNEXPRESSION)
)

$(P Enum declarations are used to define a group of constants.
They come in these forms:
)
$(OL
$(LI Named enums, which have an $(I EnumTag).)
$(LI Anonymous enums, which do not have an $(I EnumTag).)
$(LI Named enums, which have a name.)
$(LI Anonymous enums, which do not have a name.)
$(LI Manifest constants.)
)

Expand All @@ -50,10 +53,8 @@ $(H2 Named Enums)
$(P
Named enums are used to declare related
constants and group them by giving them a unique type.
The $(I EnumMembers)
are declared in the scope of the enum $(I EnumTag).
The enum $(I EnumTag) declares a new type, and all
the $(I EnumMembers) have that type.
The $(I EnumMembers) are declared in the scope of the named enum. The named
enum declares a new type, and all the $(I EnumMembers) have that type.
)

$(P This defines a new type $(CODE X) which has values
Expand Down Expand Up @@ -116,8 +117,8 @@ enum E : C
---


$(P An $(I EmptyEnumBody) signifies an opaque enum - the enum members are
unknown.)
$(P An empty enum body (For example $(CODE enum E;)) signifies an opaque
enum - the enum members are unknown.)

$(H3 Enum Default Initializer)

Expand Down Expand Up @@ -171,7 +172,8 @@ $(H2 Anonymous Enums)
)

$(OL
$(LI The $(I Type), if present.)
$(LI The $(I Type), if present. Types are not permitted when an
$(I EnumBaseType) is present.)
$(LI The $(I EnumBaseType), if present.)
$(LI The type of the $(I AssignExpression), if present.)
$(LI The type of the previous $(I EnumMember), if present.)
Expand Down Expand Up @@ -250,12 +252,12 @@ enum long l = 3; // l is 3 of type long

$(P Such declarations are not lvalues, meaning their address
cannot be taken. They exist only in the memory of the compiler.)

---
enum size = __traits(classInstanceSize, Foo); // evaluated at compile-time
---
$(P Using manifest constants is an idiomatic D method

$(P Using manifest constants is an idiomatic D method
to force compile-time evaluation of an expression.)


Expand Down
37 changes: 20 additions & 17 deletions grammar.dd
Expand Up @@ -1370,36 +1370,39 @@ $(H3 $(LNAME2 enum, Enum))

$(GRAMMAR
$(GNAME EnumDeclaration):
$(D enum) $(GLINK EnumTag) $(GLINK EnumBody)
$(D enum) $(GLINK EnumBody)
$(D enum) $(GLINK EnumTag) $(D :) $(GLINK EnumBaseType) $(GLINK EnumBody)
$(D enum) $(D :) $(GLINK EnumBaseType) $(GLINK EnumBody)

$(GNAME EnumTag):
$(I Identifier)
$(D enum) $(I Identifier) $(GLINK EnumBody)
$(D enum) $(I Identifier) $(D :) $(GLINK EnumBaseType) $(GLINK EnumBody)
$(AnonymousEnumDeclaration)

$(GNAME EnumBaseType):
$(GLINK Type)
$(GLINK2 declaration, Type)

$(GNAME EnumBody):
$(GLINK EmptyEnumBody)
$(GLINK EnumMembersBody)

$(GNAME EmptyEnumBody):
$(D ;)

$(GNAME EnumMembersBody):
$(D {) $(GLINK EnumMembers) $(D })
$(D ;)

$(GNAME EnumMembers):
$(GLINK EnumMember)
$(GLINK EnumMember) $(D ,)
$(GLINK EnumMember) $(D ,) $(I EnumMembers)
$(GLINK EnumMember) $(D ,) $(GLINK EnumMembers)

$(GNAME EnumMember):
$(I Identifier)
$(I Identifier) $(D =) $(ASSIGNEXPRESSION)
$(GLINK Type) $(I Identifier) $(D =) $(ASSIGNEXPRESSION)

$(GNAME AnonymousEnumDeclaration):
$(D enum) $(D :) $(GLINK EnumBaseType) $(D {) $(GLINK EnumMembers) $(D })
$(D enum) $(D {) $(GLINK EnumMembers) $(D })
$(D enum) $(D {) $(GLINK AnonymousEnumMembers) $(D })

$(GNAME AnonymousEnumMembers):
$(GLINK AnonymousEnumMember)
$(GLINK AnonymousEnumMember) $(D ,)
$(GLINK AnonymousEnumMember) $(D ,) $(GLINK AnonymousEnumMembers)

$(GNAME AnonymousEnumMember):
$(GLINK EnumMember)
$(GLINK2 declaration Type) $(I Identifier) $(D =) $(ASSIGNEXPRESSION)
)

$(H3 $(LNAME2 template, Template))
Expand Down

0 comments on commit d054391

Please sign in to comment.