我曾经认为C++是一种"奇怪"的语言,因为它在使用<
和>
时存在许多模糊不清的地方。但是,当我尝试实现一个解析器后,我发现了一个例子,这个例子几乎破坏了每一种使用<
和>
作为泛型类型的语言:
f(g<h, i>(j));
这段代码的语法可以被解释为一个普通的方法调用(g
),也可以被解释为给f
赋予两个比较的结果。
这些语言(尤其是Java, 我认为Java应该是LALR(1)可解析的?)如何避免这种语法的歧义性呢?
我无法想象任何非hacky/context-free的处理方式,而且我对于这种语言如何是context-free,更不用说LALR(1)-可解析了,感到困惑...
(值得注意的是,即使是GLR解析器也无法在没有上下文信息的情况下返回这个语句的单一解析!)