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

时间:2018-03-27 18:27:12

标签: javascript compiler-construction

我正在尝试在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

1 个答案:

答案 0 :(得分:1)

这种方法适用于所有现有语言(我知道无论如何)都有这些运算符,--是一个单一的标记。因此,当您看到-时,您会检查下一个字符是否是另一个-。如果是,则生成--令牌(同时使用-个字符)。如果不是,则生成-令牌(将下一个字符保留在缓冲区中)。

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

这意味着-之间的空格:--x是前缀减量(如果语言不允许前缀增加和减少,则为语法错误),- -x是一个双重否定,取消只有x

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