6
实施Anyfix注释!
在前缀表示法中,运算符位于参数之前,因此您可以想象该运算符next()会以递归方式调用。在后缀表示法中,运算符在参数之间移动,因此您可以简单地将其想象为解析树。在后缀表示法中,运算符位于参数之后,因此您可以将其想象为基于堆栈的。 用anyfix表示法,操作员可以在任何地方*。如果操作员出现并且没有足够的参数,则操作员将等待直到有足够的参数。对于这一挑战,您将实现一个非常基本的anyfix评估程序。(请注意,anyfix是我放弃的一种娱乐语言,您可以在此处试用或在此处查看) 您将需要支持以下命令: (Arity 1) 重复 负 (Arity 2) 加成 乘法 相等:返回0或1。 您可以选择对这些命令使用任何五个非空白符号。出于演示目的,我将使用"重复项,×乘法和+加法。 对于文字,您仅需要支持非负整数,但是您的解释器必须能够包含所有整数(在您语言的(合理的)整数范围内)。 让我们来看一个示例:10+5。该存储应表现为堆栈,而不是队列。因此,首先,堆栈从开始[],而排队的操作员列表从开始[]。然后,对文字10进行求值,从而使stack成为可能[10]。接下来,对运算符+进行求值,它需要两个参数。但是,堆栈上只有一个参数,因此排队的运算符列表变为['+']。然后,对文字5进行求值,从而使stack成为可能[10, 5]。在这一点上,'+'可以对运算符进行评估,使它成为堆栈[15]和队列[]。 最终的结果应该是[15]为+ 10 5,10 + 5和10 5 +。 让我们来看一个更困难的示例:10+"。堆栈和队列从[]和开始[]。10首先被评估,这使堆栈[10]。接下来,+对进行评估,它不会更改堆栈(因为没有足够的参数),并使队列成为['+']。然后,"进行评估。这样就可以立即运行,从而形成堆栈[10, 10]。+现在可以求值,以使堆栈成为[20]和队列[]。最终结果是[20]。 操作顺序如何? 让我们来看看×+"10 10。堆栈和队列都以[]: ×:堆栈未更改,队列变为['×']。 +:堆栈未更改,队列变为['×', '+']。 ":堆栈未更改,队列变为['×', '+', '"']。 10:堆栈变为[10]。即使×应该是第一个要评估的运算符,因为它首先出现,但"可以立即运行,并且没有运算符可以运行,因此可以对其进行评估。堆栈变为[10, 10]并排队['×', '+']。×现在可以求值,这使堆栈[100]和队列成为可能['+']。 10:堆栈变为[100, 10],可以+对其进行求值。堆栈变为[110]并排队[]。 最终结果是[110]。 这些演示中使用的命令与anyfix语言的命令一致。但是,由于我的解释器中的错误,最后一个示例将无法正常工作。(免责声明:您的提交将不会在anyfix解释器中使用) 挑战 选择一组5个非空白非数字字符,并根据上述规范创建一个anyfix解释器。您的程序可以输出奇异数组或包含的值;确保值栈在执行结束时仅包含单个值,并且确保运算符队列在执行结束时为空。 这是代码高尔夫球,因此以字节为单位的最短代码获胜。 测试用例 对于这些测试用例,重复项为",否定为-,加法为+,乘法为×且相等为=。 Input -> Output 1+2×3 …