16 Commits (main)

Author SHA1 Message Date
Bruno BELANYI 77a7bdfddd evalexpr: parse: do not use operator kind directly
This allows for having different tokens mapping to the same mathematical
operator, with potentially different semantics. For example, we can add
`$` as another notation for factorial, but allowing it to be chained:
meaning we can evaluate `3$$` to `720`, and still keep `3!!` as a syntax
error.

To do so, we simply need to add the following line to our operator
table:

```c
POSTOP(UNOP_FACT, 5, ASSOC_LEFT, '$', 0)
```
3 years ago
Bruno BELANYI da868be598 evalexpr: parse: parse all multi-char operators 3 years ago
Bruno BELANYI b12c3562ec evalexpr: parse: parse multi-char prefix operators 3 years ago
Bruno BELANYI 10c7a96deb evalexpr: parse: prepare for multi-char operators 3 years ago
Bruno BELANYI d82bf6e77b evalexpr: parse: simplify operators table 3 years ago
Bruno BELANYI 793a6c6f6f evalexpr: parse: reorder operator table
This change, by not breaking anything, shows that the order of the table
*probably* does not matter to the parsing code.

This also enables a future refactoring to only use the parts of the
tables that are *actually* needed, such as isolating the prefix, infix,
or postfix operators when using the table to check a subset of them
3 years ago
Bruno BELANYI 3b51111ff5 evalexpr: parse: clean-up character conversion
Differentiate the postfix and prefix cases to allow overlap in operators
used for each kind of operation
3 years ago
Bruno BELANYI 44bf3d98af evalexpr: parse: clean-up using new enum
Instead of using characters for the different precedence related
functions, use the actual operator value.
3 years ago
Bruno BELANYI f7c8413e3c evalexpr: introduce single op_kind enum
This will allow making the precendence climbing cleaner
3 years ago
Bruno BELANYI 32d17134cd evalexpr: parse: parse operand more correctly
I noted that the `right_prec` and `next_prec` functions taking a
character only work because prefix operators come after infix operators
in the table. We should compare the *actual* operator kind, which would
probably need a single operator enum to make sure there are no
collisions.
3 years ago
Bruno BELANYI b5912f508e evalexpr: parse: improve precedence climbing
The previous version of the algorithm did not take into account the fact
that the main loop should only run while we have postfix or infix
operators. This happened to work because of the small amount of
operators used in the grammar.

The previous version also had prefix operators hard-coded in the operand
parsing function.
3 years ago
Bruno BELANYI 88b7f50a3a evalexpr: parse: use single 'ops' table 3 years ago
Bruno BELANYI 92ae5e3ab9 evalexpr: allow choosing parser at build time 3 years ago
Bruno BELANYI 9a6da7b19a evalexpr: parse: add precedence climbing parser 3 years ago
Bruno BELANYI ad56ea521a evalexpr: parse: rename recursive parsing function 3 years ago
Bruno BELANYI a92e39dbec evalexpr: initial recursive descent parser 3 years ago