Java,C++,C#等如何通过<和>来克服这种特殊的语法歧义?

我曾经认为C++是“奇怪”的,具有和的所有歧义,但是在尝试实现解析器之后,我认为我发现了一个示例,它几乎打破了几乎所有使用和泛型类型的语言:<><>

f(g<h, i>(j));

这可以在语法上解释为泛型方法调用(),也可以解释为给出两个比较的结果。gf

这些语言(尤其是Java,我认为它应该是LALR(1)可解析的?)如何解决这种语法上的歧义?

我只是无法想象任何非黑客/上下文无关的处理方式,我对任何这样的语言如何与上下文无关感到困惑,更不用说LALR(1)可解析了......

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


答案 1

Java中的泛型方法调用将不会产生歧义:)<h,i>g(j)


答案 2

我只是无法想象任何非黑客/上下文无关的处理方式,我对任何这样的语言如何与上下文无关感到困惑,更不用说LALR(1)可解析了......

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

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


推荐