布尔表达式的翻译

  程序设计语言中的布尔表达式有两个作用。一是计算逻辑值,更多的情况是二,用做改变控制流语句中的条件表达式,如在if-then,if-then-else,或是while-do语句中那样。
  布尔表达式是由布尔算符and,or和not施于布尔变量或关系表达式而成。即布尔表达式的形式为E1 rop E2,其中E1和E2都是算术表达式,rop是关系符,如〈=<,=,〉=,≠等等。有的语言,如PL/1,允许更通用的表达式,其中,布尔算符,算术算符和关系算符可以施于任何类型的表达式,并不区别布尔值和算术值,只不过在需要时执行强制变换。为简单起见,只考虑如下文法生成的布尔表达式。
  E→E and E|E or E| not E|id rop id|true|false并且按通常习惯,约定布尔算符的优先顺序(从高到低)为not 、and、or,并且and和or服从左结合。
布尔表达式的翻译方法
  通常,计算布尔表达式的值有两种办法,第一种办法,如同计算算术表达式一样,步步计算出各部分的真假值,最后计算出整个表达式的值。例如,用数值1表示true,用0表示false。那么布尔表达式1 or(not 0 and 0)or 0的计算过程是:
  1 or(not 0 and 0)or 0
  =1 or(1 and 0)or 0
  =1 or 0 or 0
  =1 or 0
  =1
  另一种计算方法是采取某种优化措施,只计算部分表达式,例如要计算A or B,若计算出A的值为1,那么B的值就无需再计算了,因为不管B的值为何结果,A or B的值都为1。
  上述两种方法对于不包含布尔函数调用的表达式是没有什么差别的。但是,假若一个布尔式中会有布尔函数调用,并且这种函数调用引起副作用(如有对全局量的赋值)时,这两种方法未必等价。采用哪种方法取决于程序设计语言的语义,有些语言规定,函数过程调用应不影响这个调用处环境的计值,或者说,函数过程的工作不许产生副作用,在这种规定下,可以任选其中一种。
  若按第一种办法计算布尔表达式。布尔表达式a or b and not c翻译成的四元式序列为:
  (1) t1∶=not c
  (2) t2∶=b and t1
  (3) t3∶=a or t2
  对于像a<b这样的关系表达式,可看成等价的条件语句if a<b then 1 
  else 0,它翻译成的四元式序列为:
  (1) if a<b goto (4)
  (2) t∶=0
  (3) goto (5)
  (4) t∶=1
  (5) …
  其中用临时变量t存放布尔表达式a<b的值,(5)为后续的四元式序号。

你可能感兴趣的:(计算机理论与操作)