Scala 语法规范不匹配 if-else 与以分号结尾的一行表达式?

Scala Syntax Specification mismatch if-else with one line expression end by semicolon?

我正在学习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'。我有这些问题:

  1. println(1)之后的第一个;匹配else([[semi] ‘else’ Expr]之前的semi时,如何匹配之后的第二个'\n' ;println(1) 之后 ?
  2. 如何匹配else之后的第3个'\n'
  3. 如何匹配println(2)之后的第2个;和第4个'\n'?由于 if-else 不匹配尾部的任何 ;'\n'

在 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
}

或者,不用accolades也可以,但是声明必须写在一行中:

if (true)
  "\n" // this will be returned, can not have another line here
else 
  "\n"

无评论:if (true) "\n" else "\n"

More about if-else in Scala

我认为您认为所有换行符都必须匹配 nl 标记,这让您感到困惑。这是不正确的。

换行符 通常 仅被视为空格。在 Lexical Syntax 章节 section 1.2 Newline characters 中有一个关于换行符的很长的小节,它详细解释了何时 确切地 ,换行符是一个 nl 标记以及何时不是。

您的示例中只有第一个换行符是 nl 标记,其他三个只是空格。