| 6 | | * introduce LHSExpression, a subtype of Expression |
| 7 | | * rename !ArrayIndexExpression to !SubscriptExpression |
| 8 | | * modify !ModelBuilder to get rid of arrow expressions, replacing them with dot of star |
| | 6 | * introduce LHSExpression, a subtype of Expression: DONE |
| | 7 | * rename !ArrayIndexExpression to !SubscriptExpression: DONE |
| | 8 | * modify !ModelBuilder to get rid of arrow expressions, replacing them with dot of star: DONE |
| 10 | | * in any subscript expression `a[i]`, make sure `a` has array type. If it doesn't, translate to `*(a+i)` |
| 11 | | * in any place where a pointer is called for, but instead an array `a` is used, replace `a` with `&a[0]`. Examples include pointer arithmetic (`a+i`, `a-b`), argument to dereference operator `*`, actual arguments in function calls where the corresponding parameter has pointer type. |
| | 10 | * in any subscript expression `a[i]`, make sure `a` has array type. If it doesn't, translate to `*(a+i)` : DONE |
| | 11 | * in any place where a pointer is called for, but instead an array `a` is used, replace `a` with `&a[0]`. Examples include pointer arithmetic (`a+i`, `a-b`), argument to dereference operator `*`, actual arguments in function calls where the corresponding parameter has pointer type. : DONE |
| 22 | | * !processType, etc: for these and other fields, make them canonic using !universe.canonic(…)!. This can improve efficiency. |
| 23 | | * never return !null if a case is not handled. Instead throw an appropriate exception |
| 24 | | * use !switch instead of big if...else if… sequence |
| 25 | | * evaluation of dot expression should be simply `return universe.tupleRead(evaluate(expr.struct()…), expr.index())` or something like that |
| 26 | | * evaluation of !SubscriptExpression should be simply `return universe.arrayRead(evaluate(expr.array()…), evaluate(expr.index()…))` or something like that |
| 27 | | * evaluate of `NOT_EQUAL`: use `universe.neq()` |
| 28 | | * implement pointer addition and subtraction. |
| 29 | | * implement string literals using `universe.stringExpression()` (it returns an array of char). |
| 30 | | * references: re-do to use new (upcoming) methods in symbolic universe to create a reference to a point within a symbolic expression. this will eliminate the need to deal with navigation sequences. You still need to figure out the variable, scope and model IDs. |
| 31 | | * use a tuple with one integer field for scope IDs instead of symbolic constants. |
| 32 | | * don't do any string manipulation or parsing dynamically, if possible |
| 33 | | * `evaluate(…VariableExpression)`: the error reporting code for incorporating the state into the log entry seems general enough that you could factor it out into a separate method somewhere to re-use every time there is an error to report (maybe in Log?) |
| | 22 | * !processType, etc: for these and other fields, make them canonic using !universe.canonic(…)!. This can improve efficiency. DONE |
| | 23 | * never return !null if a case is not handled. Instead throw an appropriate exception: DONE |
| | 24 | * use !switch instead of big if...else if… sequence "mostly DONE" |
| | 25 | * evaluation of dot expression should be simply `return universe.tupleRead(evaluate(expr.struct()…), expr.index())` or something like that: DONE |
| | 26 | * evaluation of !SubscriptExpression should be simply `return universe.arrayRead(evaluate(expr.array()…), evaluate(expr.index()…))` or something like that: DONE |
| | 27 | * evaluate of `NOT_EQUAL`: use `universe.neq()`: DONE |
| | 28 | * implement pointer addition and subtraction. [addition DONE, subtraction coming] |
| | 29 | * implement string literals using `universe.stringExpression()` (it returns an array of char). DONE? |
| | 30 | * references: re-do to use new (upcoming) methods in symbolic universe to create a reference to a point within a symbolic expression. this will eliminate the need to deal with navigation sequences. You still need to figure out the variable, scope and model IDs. DONE |
| | 31 | * use a tuple with one integer field for scope IDs instead of symbolic constants. DONE |
| | 32 | * don't do any string manipulation or parsing dynamically, if possible: DONE |
| | 33 | * `evaluate(…VariableExpression)`: the error reporting code for incorporating the state into the log entry seems general enough that you could factor it out into a separate method somewhere to re-use every time there is an error to report (maybe in Log?) : DONE (state exceptions) |