我正在尝试在JavaScript中创建一个将算术表达式转换为i486兼容程序集的Web应用程序。你可以在这里看到它:
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
答案 0 :(得分:1)
这种方法适用于所有现有语言(我知道无论如何)都有这些运算符,--
是一个单一的标记。因此,当您看到-
时,您会检查下一个字符是否是另一个-
。如果是,则生成--
令牌(同时使用-
个字符)。如果不是,则生成-
令牌(将下一个字符保留在缓冲区中)。
然后在解析器中,l-expression,后跟--
标记变为后缀减量表达式,--
后跟l-expression变为前缀减量表达式。任何其他位置的--
令牌都是语法错误。
这意味着-
之间的空格:--x
是前缀减量(如果语言不允许前缀增加和减少,则为语法错误),- -x
是一个双重否定,取消只有x
。
我还应该注意,在postfix increment / decrement是一个表达式的语言中,它的计算结果是操作数的原始值,而不是递增的值。因此,如果x
以5
开头,则x++
的值应为5,之后x
的值应为6
。因此,您当前的代码实际上并没有正确实现postfix ++
(或者至少不是以与其他语言一致的方式)。此外x++ + y++
目前也会产生语法错误,因此它似乎并不真正得到支持。