3

我对上下文无关语法中的歧义概念并不是很清楚。如果有人可以帮助我并解释这个概念或提供一个很好的资源,我将不胜感激。

4

3 回答 3

5
T * U;

那是指针声明还是乘法?T在你知道什么和U实际上什么之前,你无法分辨。

所以表达式的语法取决于表达式的语义(意义)。这不是上下文无关的——在上下文无关的语言中,这只能是一件事,而不是两件事。(这就是为什么他们不让这样的表达式成为D中的有效语句的原因。)

另一个例子:

T<U> V;

这是模板使用还是大于和小于操作?(这就是为什么他们将语法更改为T!(U) Vin D —— 括号只有一种用途,而插入符号有另一种用途。)

于 2011-05-17T18:31:22.660 回答
2

你会如何解析这个:

if condition_1 then if condition_2 then action_1 else action_2

“else”属于哪个“if”?

在 Python 中,它们是:

if condition_1:
    if condition_2:
        action_1
    else:
        action_2

和:

if condition_1:
    if condition_2:
        action_1
else:
    action_2
于 2011-05-17T18:39:01.880 回答
0

考虑一个由上下文无关文法识别的输入字符串。如果字符串有两个或多个不同的最左边推导,或者您希望的解析树,则该字符串的推导不明确。如果语法产生歧义,则它是歧义的。例如,语法 S -> E + E | E * E 是一种模棱两可的语法,因为它模棱两可地导出字符串 x + x * x,换句话说,表示表达式的解析树不止一个(实际上有两个)。可以通过将语法更改为:

E -> E + T | 吨

T -> T * F | F

F -> (E) | X

重构的文法总是明确地导出字符串,即导出总是产生相同的分析树。

于 2013-02-17T00:05:44.330 回答