解析 - 为什么C ++在模板var decls方面遇到麻烦而java没有使用泛型var decls?

时间:2017-11-06 17:20:33

标签: java c++ parsing syntax compiler-construction

在C ++中,如果我写a < b > c,其含义可以是表达式语句(a < b) > c,也可以是类型为a<b>的变量c的声明。

为什么这不是java中的问题? (a < b) > c选项是否被泛型所取代,因为虽然它解析,但它总是以类型错误结束? C ++是否坚持要保留此选项以实现向后兼容?

2 个答案:

答案 0 :(得分:3)

由于不同的原因,它对C ++或Java来说都不是问题。

在Java中,a < b > c;只能是一个声明,因为任意表达式不能是expression statements。可能的表达式语句列表不包括比较或算术表达式(除了前/后递增/递减),因此该语句必须是本地声明,并且在该上下文中a必须是泛型类型。

在C ++中,如果<遵循已声明为模板的标识符,则Search-SortedArray只能是模板括号,并且该声明需要在使用标识符之前。虽然这不是特别干净的设计(它需要一个上下文相关的解析器),但该问题已经出现在C中,如果不知道标识符是否是类型别名,就无法正确解析。 [注1]这基本上要求词汇扫描仪访问符号表,并确保符号表至少包含关于&#34;种类的准确信息。每个标识符(虽然不是类型/类)。

注释

  1. 正如Ira Baxter指出的,上下文敏感解析的替代方法是使用GLR(或等效)解析引擎执行无上下文解析,该解析引擎保留所有可能的解析。然后可以通过解析后的语义分析来解决歧义。这当然是一种可接受的策略,但我不相信它是语言设计者所设想的策略设计者,他们认为在使用之前声明类型和模板很重要。

答案 1 :(得分:2)

两种语言中的真实和虚假值之间存在细微差别。

在Java中 For i = 1 To UBound(arr, 1) If arr(i, 1) <> "" Then scriptDic(arr(i, 1)) = scriptDic(arr(i, 1)) + arr(i, 2) End If 将是布尔值和c之间的比较,即使c也是布尔值,它也没有多大意义。由于Java没有运算符重载,因此不能将(a < b) > c写为(a < b) > c

另一方面,在C ++中,运算符重载允许您为(a < b) != c<分配完全不同的语义。因此,>可能根本不是布尔值。