编程语言语法中尾随逗号的历史

时间:2010-02-22 15:21:23

标签: syntax language-agnostic grammar language-design

许多编程语言允许在列表中的最后一项之后的语法中使用逗号。据说这是为了简化自动代码生成,这是可以理解的。

例如,以下是Java(JLS 10.6 Array Initializers)中完全合法的数组初始化:

int[] a = { 1, 2, 3, };

我很好奇是否有人知道哪种语言首先允许使用这些尾随逗号。显然C有它as far back as 1985

另外,如果有人知道现代编程语言的其他语法“特性”,我也会非常有兴趣听到这些语言。我读到例如Perl和Python在语法的其他部分允许使用尾随逗号时更加自由。

4 个答案:

答案 0 :(得分:4)

我刚刚发现g77 Fortran编译器有-fugly-comma Ugly Null Arguments标志,虽然它有点不同(顾名思义,相当难看)。

  

-fugly-comma选项允许使用单个尾随逗号来表示在外部过程的实际参数列表中“传递额外的尾随空参数”,并使用这个过程的空参数列表表示“传递单个空参数”。

     

例如,CALL FOO(,)表示“传递两个空参数”,而不是“传递一个空参数”。此外,CALL BAR()表示“传递一个空参数”。

我不确定这首次出现的语言版本是什么。

答案 1 :(得分:4)

我不是逗号的专家,但我知道标准Pascal对于分号是分隔符而不是终结符非常持久。这意味着如果您不想被编译器大吼大叫,您必须非常小心地放置一个。

后来Pascal式的语言(C,Modula-2,Ada等)编写了他们的标准,以接受奇怪的额外分号,而不像你只是在蛋糕混合物中撒尿。

答案 2 :(得分:2)

  

[有谁知道]现代编程语言的其他语法“特点”?

我的最爱之一Modula-3是1990年设计的,Niklaus Wirth的祝福是“帕斯卡家族”当时最新的语言。还有其他人还记得那些关于分号应该是分隔符终结者的可怕战斗吗?在Modula-3中,选择权在你手中!一系列陈述的EBNF是

stmt ::= BEGIN [stmt {; stmt} [;]] END

同样,在CASE语句中编写替代项时,Modula-3允许您使用竖线|作为分隔符或前缀。所以你可以写

CASE c OF
| 'a', 'e', 'i', 'o', 'u' => RETURN Char.Vowel
| 'y' => RETURN Char.Semivowel
ELSE RETURN Char.Consonant
END

或者你可以放弃最初的标准,也许是因为你更喜欢在那个位置写OF

我认为我喜欢和设计本身一样的是设计师意识到宗教战争正在进行,他们坚持不懈地寻找支持双方的方法。 让程序员选择!


P.S。目标Caml允许在案例表达中允许使用|,而早期和密切相关的方言标准ML则不允许。因此,案例表达式在标准ML代码中通常更为明显。


编辑:在看到TED的答案后,我检查了Modula-2语法并且他是正确的,Modula-2也支持分号作为终结符,但通过空语句的设备,这使得东西喜欢

x := x + 1;;;;;; RETURN x

法律。我想这不是一件坏事。然而,Modula-2不允许灵活使用案例分隔符|;这似乎起源于Modula-3。

答案 3 :(得分:2)

总是让我了解C的一点是,虽然它允许 intializer 列表中有一个额外的尾随逗号,但它允许一个额外的尾随逗号< em>枚举器列表(用于定义枚举类型的文字)。这种小小的不一致使我陷入困境的次数比我承认的要多。并且无缘无故!