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

问题描述

我正在学习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)semielse)之前的[[semi] ‘else’ Expr]匹配时,如何匹配{{ 1}}在'\n'之后?
  2. 如何匹配;之后的第三个println(1)
  3. 如何匹配'\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"

More about if-else in Scala