【发布时间】:2019-08-29 06:23:46
【问题描述】:
注意:这个问题不是关于“Java 没有指针”
在 C 语言中,代码identifier1 * identifier2 有两种可能的含义:
- 如果 identifier1 是一个类型,那么这可能是一个指针声明。
- 如果 identifier1 是一个变量,那么这可能是一个乘法语句。
问题是我在构建语法树时无法选择正确的产品。我检查了 Clang 的代码,似乎 Clang 必须将类型检查(通过使用符号表)放到解析阶段(如果我错了,请纠正我)。
然后我检查了javac(OpenJDK)的代码,似乎在解析阶段,没有涉及语义分析。解析器几乎可以使用令牌构建 AST。
所以我很好奇 Java 是否有同样的模棱两可的语法问题?如果解析器不知道标识符的类型,则无法选择正确的产生式的问题?
或者更笼统地说,Java 是否存在语法模棱两可的问题,以至于解析器无法在没有令牌流以外的其他信息的情况下选择产生式?
【问题讨论】:
-
我不太明白这个问题:java没有指针,所以这里不能有歧义,因为
*总是乘法。 -
我不这么认为
-
@SanderDeDycker 我认为 OP 说的是一般性,而不仅仅是
*。换句话说,是否有任何符号会在解析源代码时导致歧义,而这些符号只能通过了解上下文中使用的类型来解决。 -
一些运算符重载,可能会短暂地混淆程序员,例如,
var1 + var2可能是 addition 如果var1 = 1和var2 = 2或者它可能是 concatenation 如果var1 = "a"和var2 = "b"。在混合大小写 -var1 = "a"和var2 = 2中,结果是一个字符串。但是,+运算符的结果基于所涉及的类型,并且这些类型在编译时是已知的,因此没有歧义。在对象Long + Long的情况下,生成long。但是Long + null不会编译,除非你指定它应该是Long还是String -
@VLAZ 但是 Java 和 C 都不支持运算符重载?
标签: java parsing semantics symbol-table