在编译器设计中,如果我将语法定义为
E-->E+E/E-E/id
T-->id
既然这个语法是左递归的,我们也可以说+和 - 运算符都是左关联的,所以当构造解析树时,如果我有一个像id + id-id这样的输入,所以然后第一个id + id将被执行,然后add的结果将减去id。
如果我有一个像id + id + id的输入字符串,那么在这种情况下执行顺序将是(id + id)+ id。
我没有得到这个概念,因为我已经研究过运算符的关联性没有定义评估的顺序,如果那么真实那么解析树的生成呢,因为如果我们被要求比较两个解析树并找到哪个如果说我有一个像id + id-id这样的输入字符串,那么我们会选择解析树,其中我们有评估顺序,这样根据节点+生成的子树将首先被执行,然后是子树扎根 - 将首先执行,所以请告诉我确定c程序中评估顺序的实际参数。
答案 0 :(得分:2)
关联性定义a - b - c
是否等同于(a - b) - c
或a - (b - c)
,即c
是否添加到b
添加到{{}的结果中1}}或a
的结果是否已添加到b + c
。因此,关联性也告诉你表达式的AST是什么样的。
关联性没有告诉你的是首先评估a,b和c中的哪一个。也就是说,如果你写a
,你知道它等同于f() - g() - h()
,因为减法是左关联的。但是,您不知道在(f() - g()) - h()
和/或f
之前是否执行了g
,依此类推。当人们说关联性没有定义评估顺序时,这就是人们的意思。
澄清了确定c程序中评估顺序的实际参数。
C程序中算术表达式中操作数的评估顺序未定义。这完全取决于编译器。