编程语言

时间:2017-03-23 06:46:07

标签: programming-languages context-free-grammar

在编程语言类中,我学习了运算符优先级和关联性。 under是简单的 Context-Free-Grammar

<expr> -> <expr> + <term> | <term>
<term> -> <term> * <fact> | <fact>
<fact> -> (<expr>) | a

通过使用上面的Context-Free-Grammar,我们可以制作句子

a+a+(a+a)

我认为,操作顺序应如下:(a + a) - &gt; a + a然后加上。然而,在讲座上,教授说(a + a) - &gt; a + a和 a + a - &gt; (a + a)订单是对的。学生们处于恐慌之中。即使在下面的句子中,

(a+a)+((a+a))

两个顺序((a + a)) - &gt; (a + a)然后加上和(a + a) - &gt; ((a + a))是正确的。 他只是说,在解析树后,然后转换为汇编语言 所以顺序取决于编译器。

我不明白他的解释。 有人能解释为什么有两种可能的顺序吗?

1 个答案:

答案 0 :(得分:1)

评估顺序与分组无关。如果您需要计算X + Y(其中XY是子表达式),那么首先计算temp2 = Y然后计算temp1 = X还是其他方式。最后temp1 + temp2具有相同的值。

有时首先计算右手参数会更方便。 (例如,您可能已经从先前的计算中了解到它。)

如果XY的计算有副作用,则可能需要考虑这一点。有些语言坚持认为副作用是从左到右发生的;其他人允许任何订单。但在任何情况下,括号分组都不会影响计算的顺序。它只确定计算的内容。