某程序设计语言的表达式由运算符θ1、θ2、θ3、标识符、(、)组成,其中θ1和θ2的优先级相同,θ3的优先级低于θ1、θ2的优先级,优先级相同的运算符从右往左计算,可以用括号改变运算的顺序,则下述四种文法中哪一个可以描述上述的表达式文法?
设E为识别符号,终结符号集={θ1、θ2、θ3、(、)、I},非终结符号集={E、T、F}。
a.
E → T | E θ1 T | E θ2 T
T → F | T θ3 F
F → (E) | I
b.
E → T | T θ1 E | T θ2 E
T → F | F θ3 T
F → (E) | I
c.
E → T | E θ3 T
T → F | T θ1 F | T θ2 F
F → (E) | I
d.
E → T | T θ3 E
T → F | F θ1 T | F θ2 T
F → (E) | I
答:
(对于一个包含运算符的语言,运算符的结合顺序、运算符的优先级在文法中反映为递归的方向和推导(或规约)的先后,左递归表明左边的运算先处理,对应的运算符左结合;右递归表明右边的运算先处理,对应的运算符右结合。两个运算符连续出现,后推导出(或先被规约)的,表明其运算先被处理,因此优先级高;反之,先推导出(或后被规约)的,表明其运算后被处理,因此优先级低。)
题意要求:θ1和θ2的优先级相同,θ3的优先级低于θ1、θ2的优先级,因此θ3比θ1、θ2先推导出来,即应为图3所示的四种情形。
图3可能的文法推导顺序
因此a和b不成立。
又因为优先级相同的运算符从右往左计算,应采用右递归,即应为图4所示的情形。
图4可能的文法递归结构
故c不成立,应为d。
总结:
(1)优先级最低的终结符VT,出现在开始符号S的产生式中;
(2)优先级越低的VT离开始符号S越近;
(3)左结合——左递归
右结合——右递归