问题描述
我正在学习Scala Syntax Specification。
对if-else
语法感到困惑:
Expr1 ::= ‘if’ ‘(’ Expr ‘)’ {nl} Expr [[semi] ‘else’ Expr]
| ...
如果if-else下的一行表达式以分号结尾,该如何匹配?
if (true) // \n
println(1); //\n
else //\n
println(2); //\n
请注意,这里有4行,每行后跟'\n'
。我有这些问题:
- 当
;
之后的第一个println(1)
与semi
(else
)之前的[[semi] ‘else’ Expr]
匹配时,如何匹配{{ 1}}在'\n'
之后? - 如何匹配
;
之后的第三个println(1)
? - 如何匹配
'\n'
之后的第二个else
和第四个;
?由于'\n'
与尾部的任何println(2)
或if-else
不匹配。
解决方法
我认为您认为所有换行符都必须与nl
令牌匹配而感到困惑。那是不正确的。
换行符通常被 视为空白。词法语法章节section 1.2 Newline characters中有一个很长的换行小节,其中详细说明了确切地何时换行符是nl
标记,何时不是。 t。
示例中的第一个换行符是nl
令牌,其他三个只是空格。
在Scala中,semicolon ;
不存在(被忽略)
if-else语句非常简单,带有方括号:
if (true) {
"\n" // this will be returned
println(1) // this will be ignored
"\n" // this will be ignored
} else {
"\n" // this will be returned
println(2) // this will be ignored
"\n" // this will be ignored
}
或者,您可以不加修饰地使用,但是该语句必须写在一行中:
if (true)
"\n" // this will be returned,can not have another line here
else
"\n"
无评论:if (true) "\n" else "\n"