我对上下文敏感性和歧义如何相互影响感到困惑。
我认为正确的是:
歧义:
模棱两可的文法会导致使用左派生或右派生构造多个分析树。所有可能的语法都是模棱两可的语言是模棱两可的语言。
例如,C++ 是一种模棱两可的语言,因为 x * y 总是可以表示两种不同的东西,如下所述:为什么不能用 LR(1) 解析器解析 C++?.
上下文敏感性:
上下文相关文法具有规则,其中这些规则的左侧可能包含(非)终结符号,除了在不同类型文法的所有规则中所需的一个非终结符之外。这意味着您不能在下降时仅替换非终结符。相反,您必须先查看周围的非终结符。
现在困扰我的是或多或少说上下文敏感的解析器可以解析像 x * y 这样的歧义的语句。例如,在上面链接的问题中,声明“......一个 [在创建语法树时装饰语法树] 的解析器不是上下文无关的,而 LR 解析器(纯解析器)是上下文无关的。” 在我看来,这意味着上下文敏感的解析器(与上下文无关的解析器相反?)可以做到这一点。另一个例子是 C++ 语法是否对上下文敏感?这个问题的答案是“是的......”。同样在这里:什么是模棱两可的上下文无关语法?
我看不出这种 C++ 歧义与上下文敏感性有什么关系。我认为没有任何上下文相关的语法可以处理这种歧义。例如,如果您采用 Typedef、<other>*、PointerDeclaration -> Ident "*" Ident 之类的虚构规则
那么您仍然无法确定(通过纯解析)在 Typedef 期间是否使用了具体的第一个 Ident(例如“x”)(例如 typedef double x;)。
因此,是否有可能在链接的问题中使用术语“上下文敏感性”,尽管其含义很简单,例如上下文相关性(例如,需要比简单解析器提供的更多信息)。或者“真实的”上下文敏感性”和歧义之间是否存在任何联系。
编辑更具体的问题:上下文无关语法中是否存在任何可以通过使用上下文相关语法来处理的歧义。这个问题出现在我身上是因为在链接的问题中,听起来 C++ 的歧义有时被称为上下文敏感问题。
Edit2附加信息:《计算机系统》一书在第 346 页上指出,诸如具有相同数量的实际参数和形式参数之类的要求可以通过上下文相关的语法来表达。但这非常麻烦,因为您需要很多复杂的规则。但也许这也适用于前面提到的 C++ 歧义。所以我们有这样的规则
"Typedef double x", <other>*, PointerDeclaration -> "x" "*" Ident
当然,这样的规则是非常有限的,你需要大量的资金来表达每一种可能性。如果(理论上)上下文无关的歧义可以用上下文相关规则的使用来代替,至少这可能是解决问题的一种方法