Compiler construction GLR中的模糊非终结符

Compiler construction GLR中的模糊非终结符,compiler-construction,context-free-grammar,parser-generator,ambiguous,glr,Compiler Construction,Context Free Grammar,Parser Generator,Ambiguous,Glr,当GLR解析器以两种或两种以上的方式将某些文本减少到同一个非终端时,它会合并解析子树。Rekers为此使用“符号节点” 我认为并非每个非终端都会导致合并。提前知道哪些非终端永远不会合并将大大简化解析树的构建 例如,在ELKHONTER技术报告中,作者实现了用于GLR语法分析器的C++语法。他描述道: 该语法目前有37个移位/减少冲突、47个减少/减少冲突和8个歧义非终结符 如何区分给定CFG的不明确非终结符和不明确非终结符?我在哪里可以了解到这一点?知道哪些非终端可以产生歧义,如何以实用的方式简

当GLR解析器以两种或两种以上的方式将某些文本减少到同一个非终端时,它会合并解析子树。Rekers为此使用“符号节点”

我认为并非每个非终端都会导致合并。提前知道哪些非终端永远不会合并将大大简化解析树的构建

例如,在ELKHONTER技术报告中,作者实现了用于GLR语法分析器的C++语法。他描述道:

该语法目前有37个移位/减少冲突、47个减少/减少冲突和8个歧义非终结符


如何区分给定CFG的不明确非终结符和不明确非终结符?我在哪里可以了解到这一点?

知道哪些非终端可以产生歧义,如何以实用的方式简化解析树的构造

如果语法中没有这样的非终结符,那么可以省略符号节点构造和子树共享机制,true。它没有那么多代码,所以这场胜利很小

但是,如果任何非终结符都可能是不明确的,那么您需要机器。在所有歧义中共享该机制非常容易(我已经构建了GLR解析器)。那么你到底得到了什么

最后,一般来说(定理),你不能确定一个语法是否模棱两可。由于非终结符表示子语法,因此通常无法确定任何特定的非终结符是否具有歧义性。你可以在很多特殊情况下这样做。(事实上,我的GLR解析器生成器基本上会通过枚举非终结符的可能扩展自动发现一些歧义)