| [ea89e36] | 1 | # Plan: CFA Typed Enum | 
|---|
|  | 2 | ## Introduction | 
|---|
|  | 3 | CFA allows users to define enum with any type, and an enum's value is a subset of its supertype. The basic syntax of defining a typed enum is the follows: | 
|---|
|  | 4 |  | 
|---|
|  | 5 | <div align="center"> | 
|---|
|  | 6 | <i>enum(Typename) EnumName<sub>opt</sub> = { enumerator-list }</i> | 
|---|
|  | 7 | </div> or | 
|---|
|  | 8 | , where <i>enumerator-list</i> is a list of <i>identifier</i> or <i>identifier = const-expression</i>. | 
|---|
|  | 9 | <div> | 
|---|
|  | 10 |  | 
|---|
|  | 11 | </div> | 
|---|
|  | 12 |  | 
|---|
|  | 13 | ## CFA Typed Enum vs C Enum vs C++ Enum | 
|---|
|  | 14 | In C, an enum variable declaration is isomorphic to an integer declaration. For example, | 
|---|
|  | 15 | <div align="center"> | 
|---|
|  | 16 | <i>enum EnumType VariableName = EnumValue;</i> | 
|---|
|  | 17 | </div> | 
|---|
|  | 18 | is equivalent to | 
|---|
|  | 19 | <div align="center"> | 
|---|
|  | 20 | <i>int VariableName = EnumValue;</i> | 
|---|
|  | 21 | </div> | 
|---|
|  | 22 | For backward capatability, we perserve this behaviour in CFA. This is different from an C++ interpretation. C++ disallow an assignment to an enum variable with a value from the base type without an explicit cast. However, if a user defines an enum E using the typed syntax: | 
|---|
|  | 23 | <div align="center"> | 
|---|
|  | 24 | <i>enum E(int) = EnumValue;</i> | 
|---|
|  | 25 | </div> | 
|---|
|  | 26 | Now <i>E</i> is a proper subset of <i>int</i> type. The compiler will stop you from assignment an integer value of a variable with type E, as in C++.</p> | 
|---|
|  | 27 | Since C++11, C++ supports enum definition with an enum base. | 
|---|
|  | 28 | <div align="center"> | 
|---|
|  | 29 | <i>enum EnumName : enum-base = { enumerator-list };</i> | 
|---|
|  | 30 | </div> | 
|---|
|  | 31 | An enum base is a sequence of basic integral type specifier. | 
|---|
|  | 32 | <div align="center"> | 
|---|
|  | 33 | <i> | 
|---|
|  | 34 | enum E: char {A='a'};<br/> | 
|---|
|  | 35 | E e = A; <br/> | 
|---|
|  | 36 | cout << e << end; | 
|---|
|  | 37 | </i> | 
|---|
|  | 38 | </div> | 
|---|
|  | 39 | Will print a character 'a' to the output instead of 97.</br> | 
|---|
|  | 40 | CFA extends this idea to allows a typed enum to have an non-intergral or non-basic type. You can create an enum with a base type floating number, pointer, tuple, structure, function pointer, another enum, and more. | 
|---|
|  | 41 |  | 
|---|
|  | 42 | ## Implementation / Todo | 
|---|
|  | 43 | ### 0. Grammar | 
|---|
|  | 44 | Enumerator_value_opt: | 
|---|
|  | 45 | // empty | 
|---|
|  | 46 | // | '=' constant_expression | 
|---|
|  | 47 | //      { $$ = $2; } | 
|---|
|  | 48 | | simple_assignment_operator initializer                                        // FIX ME: enum only deals with constant_expression | 
|---|
|  | 49 | ; | 
|---|
|  | 50 | Discussion: FIX ME item. | 
|---|
|  | 51 | ### 1. Integral Type: | 
|---|
|  | 52 | $\forall$ enum_expression :  <i>enum($T$) { enumerator_list comma<sub>opt</sub> }</i>, | 
|---|
|  | 53 | where $T \in IntegralTypes.$ | 
|---|
|  | 54 | For $enumerator\_list \rightarrow$<sub>derive</sub> $identifier = constant\_expression$: | 
|---|
|  | 55 |  $Code(enumerator\_list) = Code(const\ T \ identifier = constant\_expression)$ | 
|---|
|  | 56 | For $enumerator\_list \rightarrow$<sub>derive</sub> $identifier_k$ : | 
|---|
|  | 57 |  $Code(enumerator\_list) = Code(const\ T \ identifier_k = identifier_{k-1}+1)(k>0)$ | 
|---|
|  | 58 |  $Code(enumerator\_list) = Code(const\ T \ identifier_k = 0)(k=0)$ | 
|---|
|  | 59 |  | 
|---|
|  | 60 | During the code compilation, probably during the <i>static type checking</i> we save all the enum element <b>Names</b>. A compiler throws error if an assignment to an enum variable with a expression that is not an enum name. | 
|---|
|  | 61 | $enum\ T(int) \{A =\ 'a'\}$ | 
|---|
|  | 62 | $T\ Name =\ 'a' $// Error: Cannot assign a variable of type 'T' with a value of type 'char'. | 
|---|
|  | 63 | It behaves the same as C++ and many other languages. | 
|---|
|  | 64 |  | 
|---|
|  | 65 |  | 
|---|
|  | 66 | ### 2. Non-Integral Type | 
|---|
|  | 67 | Syntax: | 
|---|
|  | 68 | $enumerator\_list \rightarrow$<sub>derive</sub> $identifier = constant\_expression$ | 
|---|
|  | 69 |  | 
|---|
|  | 70 |  | 
|---|