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