I am trying to make a web-app in JavaScript that converts arithmetic expressions to i486-compatible assembly. You can see it here:
http://flatassembler.000webhostapp.com/compiler.html
I have tried to make it able to deal with expressions that contain the incremental and decremental operators ("--" and "++"). Now it appears to correctly deal with expressions such as:
c++
However, in a response to an expression such as:
c--
the web-app responds with:
Tokenizer error: Unable to assign the type to the operator '-' (whether it's unary or binary).
The error message seems quite self-explanatory. Namely, I made the tokenizer assign to the "-" operator a type (unary or binary) and put the parentheses where they are needed, so that the parser can deal with the expressions such as:
10 * -2
And now, because of that, I am not able to implement the decremental operator. I've been thinking about this for days, and I can't decide what to even try. Do you have any ideas?
Please note that the web-app now correctly deals with the expressions such as:
a - -b
The way that this works in all existing languages (that I know of anyway) that have these operators, is that --
is a single token. So when you see a -
, you check whether the very next character is another -
. If it is, you generate a --
token (consuming both -
characters). If it isn't, you generate a -
token (leaving the next character in the buffer).
Then in the parser an l-expression, followed by --
token becomes a postfix decrement expression and --
followed by an l-expression becomes a prefix decrement expression. A --
token in any other position is a syntax error.
This means that spaces between -
s matter: --x
is a prefix decrement (or a syntax error if the language doesn't allow prefix increment and decrement), - -x
is a double negative that cancels out to just x
.
I should also note that in languages where postfix increment/decrement is an expression, it evaluates to the original value of the operand, not the incremented value. So if x
starts out as 5
, the value of x++
should be 5 and afterwards the value of x
should be 6
. So your current code does not actually correctly implement postfix ++
(or at least not in a way consistent with other languages). Also x++ + y++
currently produces a syntax error, so it doesn't seem like it's really supported at all.