Java,C ++,C#等如何利用解决这种特殊的语法歧义?

我以前认为C ++是“奇怪的”,但是在使用<>会有一些歧义,但在尝试实现解析器后,我想我找到了一个例子,它打破了使用<>作为generics类型的每种语言:

 f(g(j)); 

这可以在语法上解释为generics方法调用( g ),或者可以解释为给出两个比较的结果。

这些语言(特别是Java, 我认为应该是LALR(1) – 可解决的? )如何克服这种语法模糊性?

我无法想象任何非hacky / context-free方式来解决这个问题,而且我对任何这样的语言如何无上下文感到困惑,更不用说LALR(1)-parsable ……

(值得注意的是,即使是GLR解析器也无法为此语句返回单个解析而没有上下文!!)

java中的generics方法调用将是 g(j)所以没有歧义:)

我无法想象任何非hacky / context-free方式来解决这个问题,而且我对任何这样的语言如何无上下文感到困惑,更不用说LALR(1)-parsable ……

答案是它们不是(至少不是Java和C ++;我对C#知之甚少)。 您链接到的Java语法可以追溯到1996年,在引入generics之前。

有关进一步的讨论,请参阅C#和Java语法LALR(x)?

    Interesting Posts