29

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

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

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

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

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

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

4

2 回答 2

4

java中的通用方法调用将<h,i>g(j)是没有歧义的:)

于 2013-01-19T16:25:06.837 回答
2

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

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

如需进一步讨论,请参阅C# 和 Java 语法是否为 LALR(x)?

于 2013-01-19T09:13:53.097 回答