78 lines
1.3 KiB
Markdown
78 lines
1.3 KiB
Markdown
|
|
||
|
# Evaluator (draft)
|
||
|
|
||
|
EDIT: that's not actually quite how I implemented the evaluator.
|
||
|
|
||
|
Map
|
||
|
|
||
|
componentList:
|
||
|
bytes steam
|
||
|
first byte is a uint8 representing the type of the component
|
||
|
then depending on the type of the component there is 0 or N bytes
|
||
|
|
||
|
components types:
|
||
|
- name: integer
|
||
|
size: 4 bytes (for int)
|
||
|
- name: open parenthesis
|
||
|
size: 0 bytes
|
||
|
- name: close parenthesis
|
||
|
size: 0 bytes
|
||
|
- name: float
|
||
|
size: 32 bytes (IEEE 754)
|
||
|
- name: operator
|
||
|
size: 1 byte (255 operators are possible)
|
||
|
- name: function designator
|
||
|
desc: id of a function
|
||
|
size: 2 bytes (65536 functions are possibles)
|
||
|
|
||
|
Example map of `9+(5*(8+6))`
|
||
|
|
||
|
lexed stream
|
||
|
-TYPE:NUMERAL
|
||
|
VALUE:9
|
||
|
-TYPE:OPERATOR
|
||
|
VALUE:PLUS
|
||
|
-TYPE:OPEN_PARENTHESIS
|
||
|
VALUE:NULL
|
||
|
-TYPE:NUMERAL
|
||
|
VALUE:5
|
||
|
-TYPE:OPERATOR
|
||
|
VALUE:TIMES
|
||
|
-TYPE:OPEN_PARENTHESIS
|
||
|
VALUE:NULL
|
||
|
-TYPE:NUMERAL
|
||
|
VALUE:8
|
||
|
-TYPE:OPERATOR
|
||
|
VALUE:PLUS
|
||
|
-TYPE:NUMERAL
|
||
|
VALUE:6
|
||
|
-TYPE:CLOSE_P
|
||
|
VALUE:NULL
|
||
|
-TYPE:CLOSE_P
|
||
|
VALUE:NULL
|
||
|
|
||
|
scan the whole lexed stream
|
||
|
|
||
|
So there will be a kind of time line with reference, a list of reference
|
||
|
|
||
|
in the begining we allocate two lists, one for the component type, one for the component values
|
||
|
|
||
|
|
||
|
## Dynamics lists
|
||
|
|
||
|
we allocate N bytes (uint_8 list[2048])
|
||
|
|
||
|
methods:
|
||
|
|
||
|
list_length()
|
||
|
list_assign_int(int index, int value)
|
||
|
list_assign_float(int index, float value)
|
||
|
list_assign_uint_8(int index, uint_8 value)
|
||
|
list_get_int(int index)
|
||
|
|
||
|
etc...
|
||
|
|
||
|
|
||
|
|
||
|
|