java - 解析 - 为什么 C++ 在模板 var decls 上有问题而 java 在通用 var decls 上却没有?

标签 java c++ parsing syntax compiler-construction

在 C++ 中,如果我写 a < b > c , meaning 可以是表达式语句 (a < b) > ca<b> 类型变量 c 的声明.

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

最佳答案

出于不同的原因,对于 C++ 或 Java 来说,这并不是真正的问题。

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

在 C++ 中,一个 <如果它跟在已声明为模板的标识符之后,则只能是模板括号,并且该声明需要先于标识符的使用。虽然这不是特别干净的设计(它需要一个上下文相关的解析器),但这个问题已经存在于 C 中,如果不知道标识符是否是类型别名就无法正确解析。 [注 1] 这基本上需要让词法扫描器访问符号表,并确保符号表至少包含有关每个标识符的“种类”(尽管不是类型/类)的准确信息。


注意事项

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

关于java - 解析 - 为什么 C++ 在模板 var decls 上有问题而 java 在通用 var decls 上却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47142417/

相关文章:

java - 为什么 Java 无法在我的 Ubuntu 桌面上创建此文件?

java - 获取 URL 查询参数 GWT

java - 如何通过Cucumber从多个json文件中获取数据进行验证?

ios - swift 1.2 中的 JSON 解析问题

java - 如何检测图像是照片、剪贴画还是线条图?

c++ - C++ 和 cin.getline 的问题

c++ - openGL:无法在相机前正确绘制球体

c++ - Intel TBB取得工作进展

parsing - ANTLR 解析中看似不确定

c# - 如何使用 C# 解析值中包含 "&"的查询字符串?