运算符的结合性(形神兼备)

运算符的结合性(形神兼备)

在编译原理中,产生式就是权威。表达式如果以某产生式进行语法分析,那么就只能按照它的方式进行表达,且不能具有二义性。但是,在表达式中有时会涉及打括号的问题。很多时候,在原表达式中打括号和原表达式等价。比如

复制代码
a + b + c
等价于
(a + b) + c

但有时候却不等价 ,比如

复制代码
a - b - c
不等价于
a - (b - c)

在编译原理中,括号代表了运算符的结合性,如果运算符以左侧为标准则被称为左结合的,此时在左侧打括号和不打括号等价。反之亦然。

右结合(右倾)

首先看一段产生式

复制代码
right -> letter = right | letter
letter -> a|b|...|z

翻译成通俗的语言是

复制代码
right 可以具有如下形式 letter = right 或 letter
letter 可以具有如下形式 a|b|..|z

举例而言

复制代码
a = b
a = b = c

对于第一个例子,可以符合right -> letter = right而right可以是right -> letter,而letter->a|b|...|z

对于第二个例子,可以符合right -> letter = right而right是right -> letter = right,而right可以使right->letter,而letter->a|b|...|z

所以上述产生式可以用于描述赋值表达式。

我们把a=b=c表达式对应的语法分析树画出来

复制代码
       right
     /   |  \
    /    |   \
 letter  =   right
   |         / |  \
   a        /  |   \
        letter =   right
                     |
                   letter
                     |
                     c

可以看到语法分析树是往右侧 倾斜的,而我们的表达式a=b=c也是以右侧为标准,为什么这么说呢?因为

复制代码
a = b = c
等价于
a = (b = c)

这里发现对于运算符=而言,其结果以右侧为标准,把括号=右侧的表达式打上括号与原表达式等价。

左结合(左倾)

我们回到语法分析树的章节,看看表达式9-5+2对应产生式

复制代码
list -> list + digit | list - digit | digit
digit -> 0|1|2|3|4|5|6|7|8|9

的语法分析树是怎样的?

复制代码
        list
       / | \
      /  |  \
    list + digit
   / | \     |
  /  |  \    2
list -  digit
 |       |
digit    5
 |
 9

我们可以看到语法分析树向左倾斜,同样,我们也可以看到

复制代码
9-5+2
等价于
(9-5)+2

也就是说对运算符+而言,是以左侧为标准。

结论

形状

当表达式对应产生式的语法分析树左倾时,表达式以运算符左侧为主,等价于括号打在运算符左侧表达式。反之,当表达式对应产生式的语法分析树右倾时,表达式以运算符右侧为主,等价于括号打在运算符右侧表达式。

产生式

右倾产生式

复制代码
right -> letter = right | letter
letter -> a|b|...|z

左倾产生式

复制代码
list -> list + digit | list - digit | digit
digit -> 0|1|2|3|4|5|6|7|8|9

可以看到当产生式头部在产生式体中位于运算符左侧 时,以左侧为标准。反正,当产生式头部在产生式体中位于运算符右侧时,以右侧为主。

总之,产生式决定了运算符的结合性。

相关推荐
Zwawa11 小时前
先把轮子转稳,才不会烧心:编码器速度环 PID 怎么接回 PWM
c语言·单片机·嵌入式
Escalating_xu14 小时前
【C 语言】编译和链接:从源文件、目标文件到可执行程序完整解析
c语言·开发语言
C++ 老炮儿的技术栈14 小时前
std::atomic 是什么
linux·c语言·网络·c++·visual studio
Logic10115 小时前
C语言/数据结构位运算题解:异或XOR找出数轴移动中只出现一次的指令——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
weixin_4629019716 小时前
CubeIDE串口重定向 printf
c语言
人邮异步社区17 小时前
C语言好学,还是Python好学?
c语言·开发语言·python
水饺编程19 小时前
第2章:Linux 基础,echo 命令
linux·c语言·汇编
晓蛋19 小时前
C语言中定义常量为什么要加后缀
c语言·溢出·常量定义·后缀·类型限定
Logic10120 小时前
C语言/数据结构贡献法题解:数组权值——所有连续子数组中不同数字个数之和(O(n)解法)
c语言·数据结构·算法·数组·时间复杂度·贡献法·哈希记录
Code_Solitude20 小时前
C语言分支结构练习题(华师版)
c语言·开发语言