这个 msdn链接说 '(' 和 ')' 具有从左到右的关联性。
这有什么意义?有人可以给我一个例子吗?
在形式语法中,具有从左到右优先级的运算符是左递归的。所以用二进制加法:
S -> E
E -> E + a
E -> a
所以树看起来像:
S
|
E
|
E + a
|
E + a
|
a
如您所见,前两个a
是在后两个之前添加的。
对于右关联运算符,您的语法将包含右递归。所以用二进制取幂:
S -> E
E -> a ** E
E -> a
随后,您的解析树将如下所示:
S
|
E
|
a ** E
|
a ** E
|
a
正如您所看到的,最后两个a
是首先取幂的,其结果是第一个a
的幂(顺便说一下,这是取幂的正确关联性)。
对于三元和更大的运算符,应用相同的模式,递归规则是最左边的非终结符或最右边的非终结符。但是,对于一元运算符,它是左递归还是右递归取决于非终结符 s 分别位于左侧还是右侧。(
E
)
在两边都有一个终端的情况下,非终端虽然是递归的,但从语法的角度来看既不是左递归也不是右递归,所以我认为 MSDN 文章已经武断地声明它是“从左到右”。 "
括号的关联性与在 ind
之前评估的事实无关,也与的关联性无关,所以我不知道另一个 Jared 在说什么。a+b+c
d+(a+b+c)
a+b+c
什么不清楚?只要你有一个,它们就会成对出现,(
你就会有一个)
。一旦进入它们,你就可以从左到右进行算法运算,所以如果你有的话,d+(a+b+c)
你会这样做,a+b
然后加起来的总和然后a+b
加起来c
的总和a,b,c
d