8

我目前正在设计和实现一种小型编程语言,作为我正在上课的额外学分项目。我的问题是该语言具有三种数字类型:Long、Double 和 Fraction。分数可以用语言写成真分数或假分数(例如“2 1/3”或“1/2”)。这一事实导致词法分析器无法正确处理“2/3.5”(长/双)和“2/3”(长/长)等问题。我看到的最佳解决方案是更改除法运算符。到目前为止,我认为“\”是最好的解决方案,因为“//”开始评论。

如果您正在设计语言,您会选择“\”吗?

你会选别的吗?如果是这样,是什么?

注意:改变分数的书写方式是不可能的。

在此先感谢您的帮助,

-编辑-

目前的运营商有:

**(力量)

*(乘)

%(模数)

+(添加)

-(减法和否定法)

~(互惠的)

!(不是)

>(更大)

<(较少的)

>=(大于等于)

<=(不等)

==(平等)

<>(不等式)

&(和)

|(或者)

^(异或)

??(零合并)

=(任务)

注意:我的老师没有严格的约束要求;然而,我基本上说服了他,我可以把一个简单的分数计算器变成一种语言。更改分数的语法会违背分数计算器的分数语法,最好避免这种情况。

4

12 回答 12

9

APL 的答案是÷。我认为这是可以识别的。

于 2010-04-30T01:50:17.670 回答
6

“div”这个词怎么样?

于 2010-04-29T23:17:31.930 回答
6

您是否允许紧凑的 if 语句,例如

condition ? trueblocks : falseblocks;

在你的语法中?如果没有,您可以使用 ' : ' 作为除法运算符。毕竟,在单词周围的许多(大多数?)地方,它是除法(手工,纸上)的标准数学符号。

于 2010-04-30T00:10:11.530 回答
5

我不太确定问题出在哪里,因为我不懂语法理论。但我会尝试2_1/3使用下划线而不是空格来更改正确的分数语法,例如 to 。

关于\用作除法运算符——我当然不喜欢它,因为它在几乎所有语言中都用作转义字符。我不会推荐这样的含义过载。

于 2010-04-29T23:17:02.187 回答
3

避免使用\作为替代的另一个原因/是因为它可能会导致混淆哪个操作数是分子,哪个是分母。例如,MATLAB 算术运算符包括右除法/ 左除法\。的值为1/20.5,但 的值为1\22。换句话说,/分子在左边,\分子在右边。

于 2010-04-30T02:32:53.903 回答
1

如果它是一个类,我会简单地使用一个关键字,如dividedby. /否则,您将不得不通过其上下文弄清楚这意味着什么。真的没有任何其他适合的单一角色。

但是请注意,您的老师可能会要求您解决上下文问题,在这种情况下,他希望您使用斜线。我会问。

于 2010-04-29T23:17:53.760 回答
1

要求 Fraction 类型在所有情况下都使用 double 怎么样?即2.0 / 3.5vs2 / 3.5然后不需要新的运算符。

于 2010-04-29T23:20:31.540 回答
1

您可以采用 J 有点非标准的%除法约定(因为它有点像除法符号)和|取模。

但是你必须为按位或找到别的东西。也许/

于 2010-04-29T23:22:49.627 回答
1

我会\疯狂地避免,因为它会混淆人们的期望。

我会继续使用/,但将问题从词法分析器中移到解析器中,这样更容易处理,并且您可以发出合理的错误消息。

于 2010-04-30T00:13:43.937 回答
1

我认为两个字符/|是一个可能的想法。/是除法,|看起来像旋转了 90 度的分数。

如果您允许括号或一元运算符,我可以推荐您[2 1/2]#1/2.

于 2010-04-30T00:46:03.900 回答
1

将分数作为主要数据类型怎么样?将除法运算符视为中缀构造函数?

于 2010-04-30T01:32:24.693 回答
0

我不会选择“\”,因为它在键盘中比“/”更难访问。而且,它的使用范围更广。所以你的程序员会更多地呆在家里。

于 2010-04-29T23:24:47.360 回答