几个月前我在 D 新闻组上发布了这个问题,但由于某种原因,答案从未真正说服我,所以我想我应该在这里问。
D 的语法显然是上下文无关的 http://www.digitalmars.com/d/2.0/template-comparison.html.
然而,C++ 的语法则不然(即使没有宏)。 http://yosefk.com/c++fqa/web-vs-c++.html#misfeature-3 (请仔细阅读本文!)
现在授予,我什么都不知道(官方)关于编译器、词法分析器和解析器。我所知道的一切都是从网上学到的。
以下是(我相信)我对上下文的理解,用不太技术性的术语:
语言的语法是上下文无关的当且仅当您始终可以理解给定代码片段的含义(尽管不一定是确切的行为),而无需“查看”其他任何地方。
或者,甚至在less rigor:
如果我需要的话,语法不能是上下文无关的,我无法仅通过查看表达式来判断表达式的类型。
例如,C++ 未能通过上下文无关测试,因为meaning of confusing<sizeof(x)>::q < 3 > (2)
取决于value of q
.
到目前为止,一切都很好。
现在我的问题是:D 也可以这样说吗?
在 D 中,哈希表可以通过Value[Key]
声明,例如
int[string] peoplesAges; // Maps names to ages
静态数组可以用类似的语法定义:
int[3] ages; // Array of 3 elements
并且可以使用模板来使它们变得混乱:
template Test1(T...)
{
alias int[T[0]] Test;
}
template Test2(U...)
{
alias int[U] Test2; // LGTM
}
Test1!(5) foo;
Test1!(int) bar;
Test2!(int) baz; // Guess what? It's invalid code.
这意味着我无法说出的意思T[0]
or U
只要看看它(即它可以是一个数字,它可以是一种数据类型,或者它可以是一个天知道是什么的元组)。我什至无法判断该表达式在语法上是否有效(因为int[U]
当然不是——你不能有一个以元组作为键或值的哈希表)。
我尝试制作的任何解析树Test
would fail有意义(因为它需要知道节点是否包含数据类型、文字或标识符),除非它delays结果直到值T
是已知的(使其依赖于上下文)。
鉴于此,D 实际上是上下文无关的,还是我误解了这个概念?
为什么/为什么不呢?
Update:
我只是想评论一下:看到答案真的很有趣,因为:
- 一些答案声称 C++ 和 Dcan't与上下文无关
- 一些答案声称 C++ 和 D 是both上下文无关
- 一些答案支持这样的说法:C++ 是上下文相关的,而 D 不是
- 还没有人声称 C++ 是上下文无关的,而 D 是上下文相关的:-)
我不知道我是在学习还是变得更加困惑,但无论如何,我很高兴我问了这个……感谢大家花时间回答!