1

我曾尝试阅读 SLS,但它有一些奇怪的类似 BNF 的符号。任何人都可以澄清这个符号。例如“类型”一章有以下内容:

Type                 ::= FunctionArgTypes ‘=>’ Type
                       | InfixType [ExistentialClause]
FunctionArgTypes     ::= InfixType
                       | ‘(’ [ ParamType {‘,’ ParamType } ] ‘)’
ExistentialClause    ::= ‘forSome’ ‘{’ ExistentialDcl {semi ExistentialDcl} ‘}’ 
ExistentialDcl       ::= ‘type’ TypeDcl
                       | ‘val’ ValDcl
InfixType            ::= CompoundType {id [nl] CompoundType}
CompoundType         ::= AnnotType {‘with’ AnnotType} [Refinement]
                       | Refinement
AnnotType            ::= SimpleType {Annotation} 
SimpleType           ::= SimpleType TypeArgs
                       | SimpleType ‘#’ id | StableId
                       | Path ‘.’ ‘type’
                       | ‘(’ Types ’)’
TypeArgs             ::= ‘[’ Types ‘]’ 
Types                ::= Type {‘,’ Type}

::=和之类的符号对我来说很清楚,但是和|之间有什么区别。我也找不到诸如, , ,之类的描述。[]{}id[nl]RefinmentType

4

1 回答 1

3

你是对的,SLS 中使用的符号称为EBNF - Extended Backus-Naur Form。它是由 Pascal 的创建者 Niklaus Wirth 开发的,如果我没记错的话,他是 prof 的主管。Odersky 在他的博士研究中。所有 Scala 语法都在 SLS 的末尾(第 159 页)中进行了描述,在那里您可以找到Scala中使用的 、Type和其他内容。Refinmentnl

至于 EBNF 它本身,这里是它的语法的完整表:

Usage            Notation
definition       =
concatenation    ,
termination      ;
alternation      |
option           [ ... ]
repetition       { ... }
grouping         ( ... )
terminal string  " ... "
terminal string  ' ... '
comment          (* ... *)
special sequence ? ... ?
exception        -

SLS 中的符号稍作修改,即::=用于代替 simple=和空格用于连接而不是,

于 2013-10-15T08:21:05.047 回答