如何使用递减运算符解析表达式(例如 "c--")?

How to parse expressions with the decremental operator (e.g. "c--")?

我正在尝试在 JavaScript 中制作一个网络应用程序,将算术表达式转换为 i486 兼容的程序集。你可以在这里看到它:
http://flatassembler.000webhostapp.com/compiler.html
我试图让它能够处理包含递增和递减运算符(“--”和“++”)的表达式。现在它似乎可以正确处理以下表达式:
c++
但是,在对表达式的响应中,例如:
c--
网络应用程序响应:
Tokenizer error: Unable to assign the type to the operator '-' (whether it's unary or binary).
错误消息似乎不言自明。也就是说,我让分词器为“-”运算符分配了一个类型(一元或二元),并将括号放在需要的地方,这样解析器就可以处理如下表达式:
10 * -2
现在,正因为如此,我无法实现递减运算符。这几天我一直在考虑这个问题,我什至无法决定尝试什么。你有什么想法吗?
请注意,网络应用程序现在可以正确处理以下表达式:
a - -b

在具有这些运算符的所有现有语言(无论如何我都知道)中,它的工作方式是 -- 是单个标记。因此,当您看到 - 时,您会检查下一个字符是否是另一个 -。如果是,您将生成一个 -- 令牌(消耗两个 - 个字符)。如果不是,则生成一个 - 标记(将下一个字符留在缓冲区中)。

然后在解析器中,l-expression 后跟 -- 标记成为后缀递减表达式,-- 后跟 l-expression 成为前缀递减表达式。任何其他位置的 -- 标记都是语法错误。

这意味着 - 之间的空格很重要:--x 是前缀递减(如果语言不允许前缀递增和递减,则为语法错误),- -x是一个双重否定,抵消为 x.

我还应该注意,在后缀 increment/decrement 是表达式的语言中,它的计算结果为操作数的原始值,而不是增量值。因此,如果 x 开始为 5,则 x++ 的值应为 5,之后 x 的值应为 6。因此,您当前的代码实际上并未正确实现 postfix ++ (或者至少与其他语言不一致)。另外 x++ + y++ 目前会产生语法错误,因此它似乎根本不受支持。