SLS语言规则表示法

时间:2013-10-15 07:26:33

标签: scala specifications

我试过读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等内容的说明。

1 个答案:

答案 0 :(得分:3)

你是对的,SLS中使用的符号称为EBNF - 扩展Backus-Naur形式。它是由Pascal的创建者Niklaus Wirth开发的,如果我没有弄错的话,他还是教授的主管。奥德斯基在他的博士研究中。所有Scala语法都在SLS(第159页)的末尾进行了描述,您可以在其中找到TypeRefinmentnl以及Scala中使用的其他内容。

至于它自己的EBNF,这里是它的语法的完整表格:

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

SLS中的符号略有修改,即使用::=而不是简单的=和用于连接的空格而不是,