【问题标题】:How does associativity affects the order of evaluation of operands?关联性如何影响操作数的求值顺序?
【发布时间】:2015-04-08 08:13:52
【问题描述】:

在编译器设计中,如果我有一个语法定义为

E-->E+E/E-E/id
T-->id

现在,由于这个语法是左递归的,而且我们可以说 + 和 - 运算符都是左关联的,所以当解析树被构造时,如果我有一个像 id+id-id 这样的输入,所以首先 id+id 将被执行,然后加法的结果将减去 id 。

如果我有一个像 id+id+id 这样的输入字符串,那么在这种情况下执行顺序将是 (id+id)+id 。

我没有得到这个概念,因为我已经研究过运算符的关联性没有定义评估的顺序,如果这是真的那么解析树的生成呢,因为如果我们被要求比较两个解析树并找到哪个如果说我有一个像 id+id-id 这样的输入字符串,那么我们会选择解析树,其中我们有评估顺序,这样以节点 + 为根的子树将首先执行,然后是子树植根于 - 将首先执行,所以请澄清决定c程序中评估顺序的实际参数。

【问题讨论】:

  • 我不认为“操作数的评估顺序”意味着你认为它的意思。当您有(a + b) + c 时,顺序属于abc,而不是表达式的结果。当然,子表达式 a + b 在最终表达式之前被计算。
  • 运算符优先级对执行顺序没有影响(涉及序列点的地方除外)。编译器生成的解析树也没有。
  • 示例:int value_of_life = work_hard() + marry() + make_children()。根据健康状况和宗教信仰,结果可能会因操作数的评估顺序而异。

标签: c compiler-construction


【解决方案1】:

关联性定义a - b - c是否等价于(a - b) - ca - (b - c),即c是否添加到ba相加的结果中,或者b + c的结果是否为添加到a。因此,关联性还可以告诉您表达式的 AST 是什么样的。

关联性没有告诉您的是 a、b 和 c 中的哪一个首先被评估。也就是说,如果你写f() - g() - h(),你知道它等价于(f() - g()) - h(),因为减法是左结合的。但是您不知道f 是否在g 和/或h 之前执行,等等。这就是人们说关联性不定义评估顺序时的意思。

请解释一下决定 c 程序中评估顺序的实际参数。

C 程序中算术表达式中操作数的求值顺序未定义。那完全取决于编译器。

【讨论】:

  • 好的,我明白了,但是如果它是一个自上而下的解析器,它不会先评估叶子然后再评估上层节点的解析树呢,那么如果运算符是左关联的,那么这个表达式不会首先评估叶子然后向上移动。
  • @RADHAGOGIA 编译器(或我们正在编写解释器的解释器)遍历 AST 的顺序与解析器解析源以生成 AST 的顺序无关。在 AST 遍历代码中是先访问左子树还是先访问右子树(或者是否只访问其中一个)仍然完全取决于您 - 这完全独立于所使用的解析算法。
  • 先生,请简单解释一下,我还是很困惑,解析器本身就是编译器的一部分,所以最后只根据AST进行评估,如果不是那么建立起来有什么用AST 如果不必根据 AST 进行评估
  • @RADHAGOGIA 首先,编译器不会评估任何东西(除非进行优化),它会生成代码,然后由机器评估。其次,AST 不是语义。 AST 并没有说明应该首先评估(或根本不评估)左子节点还是右子节点。这是由语言的语义决定的,在 C 语言的情况下,它是开放的。建立 AST 的用途是,您可以按照您需要的任何方式进行操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多