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

lin*_*bin 1 compiler-construction syntax grammar scala

我正在学习Scala 语法规范

if-else语法弄糊涂了:

  Expr1             ::=  ‘if’ ‘(’ Expr ‘)’ {nl} Expr [[semi] ‘else’ Expr]
                      |  ...
Run Code Online (Sandbox Code Playgroud)

它如何在 if-else 下方匹配以分号结尾的一行表达式?

if (true) // \n
  println(1); //\n
else //\n
  println(2); //\n
Run Code Online (Sandbox Code Playgroud)

请注意,有 4 行,每行后跟一个'\n'. 我有这些问题:

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

Jör*_*tag 5

我认为您对所有换行符都必须与nl令牌匹配感到困惑。那是不正确的。

换行符通常被简单地视为空格。有在词汇语法章换行符很长款部分1.2换行符其中详细解释的时候,正好,换行字符是一个nl令牌,当它不是。

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