我曾经认为C++是"怪异"的一个与所有与歧义<和>,而是试图实现一个解析器我想我找到打破一个例子之后几乎每一个使用的语言<和>泛型类型:
f(g<h, i>(j));
Run Code Online (Sandbox Code Playgroud)
这可以在语法上解释为泛型方法call(g),也可以解释为给出f两次比较的结果.
这些语言(特别是Java,我认为应该是LALR(1) - 可解决的?)如何克服这种语法模糊性?
我无法想象任何非hacky/context-free方式来解决这个问题,我对这种语言如何无上下文感到困惑,更不用说LALR(1)-parsable ......
(值得注意的是,即使是GLR解析器也无法为此语句返回单个解析而没有上下文!!)
我想知道C#和Java语法是否是LALR(x)?如果是的话,x的价值是多少?
编辑:
在接受了真正的答案之后,我认为以这种方式改变Q更好:
是否有任何LALR(x)解析器可以解析当前版本的Java(版本7)或C#(版本4)?如果是,x的值是多少?
(我正在度假时间谈论一些语言理论.如果这是一个天真的问题,请原谅.)
根据这里:
LL语法,特别是LL(1)语法,具有很大的实际意义,因为这些语法的解析器易于构造,并且由于这个原因,许多计算机语言被设计为LL(1).
那么,出于好奇,当代计算机语言是LL(1)?C,Java,C#或Python是否属于这一类?
我对维基百科的以下引用感到困惑:
换句话说,如果一种语言足够合理以允许高效的单遍解析器,则它可以由 LR(k) 语法来描述。并且该语法总是可以机械地转换为等效(但更大)的 LR(1) 语法。因此,从理论上讲,LR(1) 解析方法足以处理任何合理的语言。在实践中,许多编程语言的自然语法接近 LR(1)。[需要引用]
这意味着如果能够将语法转换为语法,则解析器生成器(如bison)将非常强大(因为它可以处理LR(k)语法)。是否存在一些这样的例子,或者如何做到这一点的秘诀?我想知道这一点,因为我的语法中有移位/归约冲突,但我认为这是因为它是一种语法,并且想将其转换为语法。附带问题:是一种不合理的语言,因为我读过,生成的解析器无法解析它。LR(k)LR(1)LR(2)LR(1)C++bison