[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 | |
---|