Computer science 上下文无关语法-帮助我理解

Computer science 上下文无关语法-帮助我理解,computer-science,context-free-grammar,Computer Science,Context Free Grammar,我现在正在读汤姆·斯图尔特的《理解计算》一书,顺便说一句,这是一本很棒的书,它教会了我很多东西,对于像我这样缺乏正规数学训练但想更好地理解计算机科学的人来说,它是一个宝贵的资源。强烈推荐!我们现在讨论的是上下文无关语法。关于CFG有一个特别的点,我还没有能够开发出一个足够的心智模型——让我用一个例子来演示 为了简单起见,本书使用了一个非常有限的CFG示例,它只能处理完整编程语言中可能出现的可能性的一个非常严格的子集。单引号中的内容表示标记,尖括号中的内容表示符号: <statement&g

我现在正在读汤姆·斯图尔特的《理解计算》一书,顺便说一句,这是一本很棒的书,它教会了我很多东西,对于像我这样缺乏正规数学训练但想更好地理解计算机科学的人来说,它是一个宝贵的资源。强烈推荐!我们现在讨论的是上下文无关语法。关于CFG有一个特别的点,我还没有能够开发出一个足够的心智模型——让我用一个例子来演示

为了简单起见,本书使用了一个非常有限的CFG示例,它只能处理完整编程语言中可能出现的可能性的一个非常严格的子集。单引号中的内容表示标记,尖括号中的内容表示符号:

<statement> ::= <while> | <assign>
<while> ::= 'w' '(' <expression> ')' '{' <statement> '}'
<assign> ::= 'v' '=' <expression
<expression> ::= <less-than>
<less-than> ::= <multiply> '<' <less-than> | <multiply>
<multiply> ::= <term> '*' <multiply> | <term>
<term> ::= 'n' | 'v'
以下是一些例子,说明了如何使用我目前的思维模式大声朗读其中一些内容:

语句可以是while循环或赋值 就这个有限的例子而言,这对我来说非常有意义

术语可以是数字文字或变量 再一次,考虑到有限的范围,这对我来说非常有意义

乘法可以是一个项乘以另一个乘法或一个项 好了,现在我有点害怕了!我明白,让小于变成乘法是让整个事情运作的潜在魔法的一部分,也就是说,这是我们的非确定性下推自动机能够探索每一种可能的组合的机制,但从逻辑上——至少从我的阅读方式来看——我无法理解它的意义。为什么我所说的这一点不仅会被推到上一个水平——我的意思是:

<expression> ::= <less-than> | <multiply>

有什么理由我们必须先检查它是否是有效的小于,然后再检查它是否是一个乘法,如果我们已经确定它不小于,我相信答案与可嵌套有关。可以是<,也可以是简单的

话虽如此,理论上你可以复制,但它只是变得多余。无论哪种方式,当没有续集时,你都必须给出你描述的结果

例如,问题中定义的语法适用于以下情况:

v=n<v
a + b < 3 * c
如果您原谅XML符号,您会发现,这是我能想出的最好的方法来说明我的观点:

<statement>
    <assign>
        v
        =
        <expression>
            <less-than>
                <multiply><term>n</term></multiply>
                &lt;
                <less-than>
                    <multiply><term>v</term></multiply>
                </less-than>
            </less-than>
        </expression>
    </assign>
</statement>
但是如果你没有用|来定义,那么v上面的最后一个v不满足语法中的任何定义,更好的是,这个定义永远不会结束

如果你写

a * b + c
或者,就此而言

c + a * b
你可能指的是c和a与b的乘积之和。如果在第一个表达式中,您指的是a与b和c之和的乘积,则应使用括号:

a * (b + c)
我们如何在CFG中表达这一点?我们需要说,总和可以是一个加号,两边各有一个乘积。但不仅仅是一个乘积:它也可以是一个指数,或除法,当然也可以是一个变量或数字。或括号中的任何表达式

此外,乘法和加法是关联的,但并非所有的数学运算符都是关联的。例如,9-5-2不同于9-5-2,按照惯例,9-5-2被认为是第二种。所以减法可以在右边有另一个减法,但不能在左边,除非用括号括起来

类似的观察也适用于比较。在以下方面:

v=n<v
a + b < 3 * c

其目的是将太阳与产品进行比较,而不是根据比较结果进行算术运算。

我不确定这与您所说的有多一致,但这是否与个别表达式类型的复合性质有关?小于可以由其他小于、乘和/或项的组合组成。乘法只能由项组成。一个术语只能是两个标记中的一个。我认为机器——正如它解析的那样——必须首先耗尽最复杂的可能性,然后是第二复杂的可能性,等等。这就是你通过嵌套得到的吗?有可能我们用不同的措辞描述同一件事我认为这对我来说最有意义。在我看来,我认为这是按照复杂性的顺序用尽可能。e、 g.在你的c+a*b中,如果我们的CFG在计算c+a的第一件事情上跳了起来,我们将得到错误的答案,因此我们必须确定,+标记右侧的内容并不仅仅是一个简单的标记。只有当我们用尽了所有这些可能性,我们才能安全地假设这是基本的c+a算法。@user3179733:当然,每个人都有自己的直觉,所以你的直觉对我来说没有意义并不重要。并不是说a+b比a*b更复杂;更重要的是先抓住它的论点