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 によって開発されました。彼の博士号研究における Odersky。Typeすべての Scala 構文は、SLS の最後 (159 ページ) で説明されており、Scala で使用される、Refinmentnlおよびその他のものを見つけることができます。

EBNF 自体については、構文の完全な表を次に示します。

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

SLS の表記法はわずかに変更されています。つまり::=、単純な記号の代わりに が使用=され、連結記号の代わりにスペースが使用されます。,

于 2013-10-15T08:21:05.047 に答える