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

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

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

复制代码
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

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

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

相关推荐
§ꦿCFོ༉8 小时前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
Severus_black17 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
唐青枫19 小时前
C 语言 strcpy() 用法详解与实战 Demo
c语言
程序猿打工仔20 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
꧁细听勿语情꧂1 天前
二叉树余题,排序、直接插入排序、希尔排序
c语言·开发语言·数据结构·算法
蜀黍@猿1 天前
ARM 汇编入门(十二):MMU、页表与虚拟内存全解析
汇编·arm开发·stm32·mcu
是main不是漫1 天前
【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基
c语言·开发语言·c++
Felven2 天前
C. Brr Brrr Patapim
c语言·开发语言
Zwawa2 天前
嵌入式OLED表驱动菜单:用一张表、一个栈和一个窗口重写表驱动菜单
c语言·单片机·嵌入式
蜀黍@猿2 天前
ARM 汇编入门(十):标量浮点与 VFP 指令全解析
汇编·arm开发·stm32·mcu