码迷,mamicode.com
首页 > 其他好文 > 详细

Scala前缀,中缀及后缀运算详解

时间:2015-03-19 13:23:56      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:scala

语法:
PostfixExpr ::= InfixExpr [id [nl]]
InfixExpr ::= PrefixExpr
| InfixExpr id [nl] Inf2424ixExpr
PrefixExpr ::= [?-? | ?+? | ?!? | ?~?] SimpleExpr
表达式由算符和操作数构成。
6.12.1. 前缀运算
前缀运算op e由前缀算符op(必须是?+?, ?-?, ?!?或?~?之一)。表达式op e等价于后缀方法应用e.unary_op。
前缀算符不同于普通的函数应用,他们的操作数表达式不一定是原子的。例如,输入序列-sin(x)读取为-(sin(x)),函数应用negate sin(x)将被解析为将中缀算符sin应用于操作数negate和(x)。
6.12.2. 后缀操作
后缀算符可以是任意标识符。后缀操作e op被解释为e.op。
6.12.3. 中缀操作
中缀算符可以是任意标识符。中缀算符的优先级和相关性定义如下:
中缀算符的优先级由算符的第一个字符确定。字符按照优先级升序在下面列出,同一行中的字符具有同样的优先级。
(所有字母)
|
^
&
< >
= !
:
+ -
* / %
(所有其他特殊字符)
也就是说,由字母开头的算符具有最低的优先级,然后是由?|?开头的算符,下同。
这个规则中有一个例外,就是赋值算符(§6.12.4)。赋值算符的优先级与简单赋值(=)相同。也就是比任何其他算符的优先级要低。
算符的相关性由算符的最后一个字符确定。由?:?结尾的算符是右相关的。其他所有算符是左相关的。
算符的优先级和相关性确定了表达式部件结组的方式:
 如果表达式中有多个中缀运算,那么具有高优先级的算符将比优先级低的绑定的更紧。
 如果具有连贯的中缀运算e0 op1 e1 op2...opn en,且算符op1,...,opn具有同样的优先级,那么所有的这些算符将具有同样的相关性。如果所有算符都是左相关的,该序列将解析为(...(e0 op1 e1) op2...) opn en。否则,如果所有算符都是右相关的,则该序列将解析为e0 op1(e1 op2 (...opn en)...)
后缀算符的优先级总是比中缀算符低。例如e1 op1 e2 op2总是等价于(e1 op1 e2) op2。
左相关算符的右侧操作数可以由在括号中的几个参数组成,例如e op(e1,...,en)。该表达式将被解析为e.op(e1,...,en)。
左相关位运算e1 op e2解析为e1.op(e2)。如果op是右相关的,同样的运算将被解析为{ val x=e1; e2.op(x) },这里x是一个新的名称。
6.12.4. 赋值算符
赋值算符是一个由等号“=”结尾的算符记号((§1.1)中的语法类op),但具有以下条件的算符除外:
(1) 算符也由等号开始,或
(2) 算符是(<=), (>=), (!=)中的一个
赋值算符做特殊处理,如果没有其它有效的解释,则扩展为赋值。
我们考虑一个赋值算符,比如+=。在中缀运算l += r中,l和r是表达式。该运算可以重新解释为负责赋值的运算
l = l + r
除非该运算的做的l只计算一次
在以下两种条件下会发生再解析。
1. 左侧的l没有一个名为+=的成员,且不能由隐式转换(§6.25)转换为拥有成员+=的值。
2. 赋值运算l = l + r是类型正确的。特别此处暗含了l引用了一个变量或对象,且该变量或对象可以赋值,且可转变为一个具有名为+的成员的值。

Scala前缀,中缀及后缀运算详解

标签:scala

原文地址:http://blog.csdn.net/crxy2016/article/details/44454995

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!