0

我一定错过了规范中此处使用的符号的定义位置。例如,完全破译它的前两行将非常有帮助:

Expr         ::=  (Bindings | id | `_') `=>' Expr
               |  Expr1

id对定义的位置以及该符号的语法(以及因此的解释)一无所知。

谢谢!

4

2 回答 2

1

id是从词法上来的。简而言之,它是:

upper            ::=  ‘A’ | … | ‘Z’ | ‘$’ | ‘_’  // and Unicode category Lu
lower            ::=  ‘a’ | … | ‘z’ // and Unicode category Ll
letter           ::=  upper | lower // and Unicode categories Lo, Lt, Nl
digit            ::=  ‘0’ | … | ‘9’
opchar           ::= // printableChar not matched by (whiteSpace | upper | lower |
                     // letter | digit | paren | delim | opchar | Unicode_Sm | Unicode_So)

op               ::=  opchar {opchar}
varid            ::=  lower idrest
plainid          ::=  upper idrest
                 |  varid
                 |  op
id               ::=  plainid
                 |  ‘`’ stringLiteral ‘`’
idrest           ::=  {letter | digit} [‘_’ op]

Bindings在上下文无关语法中进一步定义,但在第 2 章中定义

Scala 中的名称标识了统称为实体的类型、值、方法和类。名称由局部定义和声明、继承、导入子句或包子句引入,这些子句统称为绑定。

但这意味着什么

非正式语言:

Expr ::= (Bindings | id | `_') `=>' Expr
         |  Expr1

可以写成:

AnExpr应理解为::=( (...)) a Bindings、anid或文字下划线字符 ( '_'),后跟等号和直角括号字符 ( '=>'),后跟 anExpr或 an Expr1

非正式的语言,你可以说:

表达式 ( Expr) 是任何有效的绑定语法(魔术_或普通变量引用,一次或多次,可能带有类型归属)或变量引用,或者只是一个魔术_,后跟箭头 ( =>),后跟任何表达式我们允许在语言中

于 2015-09-10T17:29:57.920 回答
1

我不确定非终端id是如何定义的,但希望我能帮助你理解这个符号。

该符号看起来像Backus-Naur Form。这意味着 anExpr是以下之一:

  1. Bindings '=>' Expr
  2. id '=>' Expr
  3. '_' '=>' Expr
  4. Expr1

引号中的标记'是字符串文字,而未引用的标记是非终结符,这意味着它们可以进一步扩展。

因此,如果我有以下代码片段:

x => x * x

那么这可能会被解析为如下所示:

    Expr
   / |  \
 id '=>' Expr
 |        |
'x'     Expr1
          |
       BinaryOp
       /  |  \
   Expr1 '*' Expr1
     |        |
    id       id
     |        |
    'x'      'x'
于 2015-09-10T17:49:24.873 回答