2015-04-08 129 views
0

在编译器设计,如果我有,因为这个语法定义为关联性如何影响操作数的评估顺序?

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

现在文法是左递归的,而且我们也可以说,无论是+和 - 运算符是左结合这样的话,当解析树将被构造,所以如果我有像id + id-id这样的输入,那么第一个id + id会被执行,然后加法的结果会减去id。

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

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

+0

我不认为“操作数的评估顺序”意味着你认为它的含义。当你有'(a + b)+ c'时,顺序就属于'a','b'和'c',而不是表达式的结果。当然,在最终表达式之前评估子表达式“a + b”。 –

+2

运算符优先级对执行顺序没有影响(除涉及序列点外)。编译器生成的分析树也不是。 – Wintermute

+0

示例:'int value_of_life = work_hard()+ marry()+ make_children()'。取决于健康和宗教信仰,取决于操作数的评估顺序,结果可能会出人意料地发生变化。 –

回答

2

的关联性定义a - b - c是否等于或(a - b) - ca - (b - c),即c是否被添加到如果b + c加到a添加ba或是否结果的结果。因此,关联性还会告诉您表达式的AST如何。

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

澄清决定c程序中评估顺序的实际参数。

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

+0

好吧,我明白了,但是那么解析树如何以某种顺序评估表达式呢,它不会评估叶子,然后评估上层节点,如果它是自顶向下的解析器,那么如果操作员离开 - 关联性的,那么这个表达式不会首先评估叶子,然后向上移动。 –

+0

@RADHAGOGIA编译器(或我们正在编写解释器的解释器)遍历AST的顺序与解析器解析源以生成AST的顺序无关。无论您在AST遍历代码中首先访问左侧还是右侧子树(或者仅访问其中一个),完全取决于您,这完全独立于所使用的解析算法。 – sepp2k

+0

先生,请简单解释一下,我仍然感到困惑,解析器是编译器本身的一部分,所以最后评估只根据AST完成,如果不是的话,那么如果评估没有,那么建立AST有什么用处根据AST –