【发布时间】: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时,顺序属于a、b和c,而不是表达式的结果。当然,子表达式a + b在最终表达式之前被计算。 -
运算符优先级对执行顺序没有影响(涉及序列点的地方除外)。编译器生成的解析树也没有。
-
示例:
int value_of_life = work_hard() + marry() + make_children()。根据健康状况和宗教信仰,结果可能会因操作数的评估顺序而异。