我试过读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]
,Refinment
,Type
等内容的说明。
答案 0 :(得分:3)
你是对的,SLS中使用的符号称为EBNF - 扩展Backus-Naur形式。它是由Pascal的创建者Niklaus Wirth开发的,如果我没有弄错的话,他还是教授的主管。奥德斯基在他的博士研究中。所有Scala语法都在SLS(第159页)的末尾进行了描述,您可以在其中找到Type
,Refinment
,nl
以及Scala中使用的其他内容。
至于它自己的EBNF,这里是它的语法的完整表格:
Usage Notation
definition =
concatenation ,
termination ;
alternation |
option [ ... ]
repetition { ... }
grouping ( ... )
terminal string " ... "
terminal string ' ... '
comment (* ... *)
special sequence ? ... ?
exception -
SLS中的符号略有修改,即使用::=
而不是简单的=
和用于连接的空格而不是,