Java,C ++,C#等如何利用解决这种特殊的语法歧义?
我以前认为C ++是“奇怪的”,但是在使用<
和>
会有一些歧义,但在尝试实现解析器后,我想我找到了一个例子,它打破了使用<
和>
作为generics类型的每种语言:
f(g(j));
这可以在语法上解释为generics方法调用( g
),或者可以解释为给出两个比较的结果。
这些语言(特别是Java, 我认为应该是LALR(1) – 可解决的? )如何克服这种语法模糊性?
我无法想象任何非hacky / context-free方式来解决这个问题,而且我对任何这样的语言如何无上下文感到困惑,更不用说LALR(1)-parsable ……
(值得注意的是,即使是GLR解析器也无法为此语句返回单个解析而没有上下文!!)
java中的generics方法调用将是
我无法想象任何非hacky / context-free方式来解决这个问题,而且我对任何这样的语言如何无上下文感到困惑,更不用说LALR(1)-parsable ……
答案是它们不是(至少不是Java和C ++;我对C#知之甚少)。 您链接到的Java语法可以追溯到1996年,在引入generics之前。
有关进一步的讨论,请参阅C#和Java语法LALR(x)?