我一定错过了规范中此处使用的符号的定义位置。例如,完全破译它的前两行将非常有帮助:
Expr ::= (Bindings | id | `_') `=>' Expr
| Expr1
我id
对定义的位置以及该符号的语法(以及因此的解释)一无所知。
谢谢!
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
可以写成:
An
Expr
应理解为::=
((...)
) aBindings
、anid
或文字下划线字符 ('_'
),后跟等号和直角括号字符 ('=>'
),后跟 anExpr
或 anExpr1
。
用更非正式的语言,你可以说:
表达式 (
Expr
) 是任何有效的绑定语法(魔术_
或普通变量引用,一次或多次,可能带有类型归属)或变量引用,或者只是一个魔术_
,后跟箭头 (=>
),后跟任何表达式我们允许在语言中
我不确定非终端id
是如何定义的,但希望我能帮助你理解这个符号。
该符号看起来像Backus-Naur Form。这意味着 anExpr
是以下之一:
Bindings '=>' Expr
id '=>' Expr
'_' '=>' Expr
Expr1
引号中的标记'
是字符串文字,而未引用的标记是非终结符,这意味着它们可以进一步扩展。
因此,如果我有以下代码片段:
x => x * x
那么这可能会被解析为如下所示:
Expr
/ | \
id '=>' Expr
| |
'x' Expr1
|
BinaryOp
/ | \
Expr1 '*' Expr1
| |
id id
| |
'x' 'x'