如何为我的编程语言实现链式比较运算符支持?

问题描述 投票:0回答:1

首先,我的编程语言名为 Ignite,是一种转译的编程语言,并将 Ignite 源文件转换为 C++ 源文件。

链式比较运算符是指将比较运算符(例如

<=
!=
>
等)链接在一起,这意味着在单个表达式中使用多个这些运算符,而无需引入其他逻辑运算符将他们分开。一个例子是:
x < y < z

问题是我要执行什么黑魔法才能将此表达式解释为 C++ 中的有效表达式,使其与数学一致?

对于 Python,它只是简单地在链式运算符之间添加一个 AND 表达式,因此

x < y < z
将变为
x < y && y < z
。它适用于像这样的简单情况。我最初的想法是一次只允许一个比较运算符,因此如果您使用
<
作为链中的第一个运算符,则必须在链中的后续运算符中仅使用
<
。但这并不理想,因为您可以将此表达式
x < y <= z
作为有效的数学表达式。

好吧...那么如果我允许混合运算符,

x < y > z
是一个有效的运算符链,但在数学中没有意义(如果我错了,请纠正我)。这将被解释为
x < y && y > z

但是如果你的表达是

x != y != z
怎么办?这是一个有效的数学表达式,表示“x、y 和 z 彼此不相等”。但将其解释为
x != y && y != z
并不是最好的描述,因为
x
仍然可以等于
z

我想出的是将其解释为

x != y && x != z && x != y
,即将所有变量与除自身之外的所有其他变量进行比较。当您有相同类型的操作员时,这很有效。但很快就成为
x < y <= z
的问题。在口译时,您会使用哪两个(
<
<=
)来比较
x
z

所以我继续使用这两个运算符并对它们进行 OR 运算,因此它将其解释为

x < y && (x < z || x <= z) && y <= z
。但是现在,如果您有一个有效的数学表达式
x == y == z != 1
,意思是“x、y 和 z 都相等但不等于 1”,该怎么办?使用我的逻辑会导致表达式
x == y && x == z && (x == 1 || x != 1) && y == z && (y == 1 || y != 1) && z != 1
...想一想,它有效...但是有更好的方法吗?

谢谢。

language-design
1个回答
0
投票

您不必以同样的方式对待所有运营商链。

如果您确实想将

x != y != z
定义为
x != y && x != z && x != y
,这并不妨碍您将
x < y <= z
定义为
x < y && y <= z
,并将
x < y > z
定义为语法错误。

© www.soinside.com 2019 - 2024. All rights reserved.