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

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

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

复制代码
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 = rightright可以是right -> letter,而letter->a|b|...|z

对于第二个例子,可以符合right -> letter = rightrightright -> 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

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

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

相关推荐
似是燕归来3 小时前
嵌入式工程师进阶指南:适配器编程设计模式一
c语言·stm32·适配器模式·嵌入式开发
skywalk81634 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
额鹅恶饿呃6 小时前
C语言中的数据结构和变量
c语言·数据结构·算法
学逆向的8 小时前
汇编——内存
开发语言·汇编·算法·网络安全
捷瑞电子工坊10 小时前
C语言条件操作符(? :)——三分钟上手
c语言·条件操作符·编程基础·三目运算符
A.零点10 小时前
期末复习,408考研数据结构:第一章绪论完整知识梳理与真题深度解读
c语言·数据结构·笔记·考研
学逆向的13 小时前
汇编——位运算
开发语言·汇编·算法·网络安全
hai31524754313 小时前
九章编译法----空间几何统一编译法
网络·汇编·人工智能·线性代数
xu_wenming13 小时前
Zephyr上开发 BLE(低功耗蓝牙)入门应用
c语言·嵌入式硬件·物联网
三十岁老牛再出发14 小时前
07.08.&07.09.每日总结
c语言·python