我试过读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这样的东西的描述。
发布于 2013-10-15 08:21:05
你说得对,SLS中使用的符号叫做EBNF -。它是由帕斯卡的创建者尼克劳斯·威思( Niklaus )开发的,如果我没弄错的话,他是教授的主管。奥德斯基博士的研究。所有Scala语法都在SLS的末尾描述(第159页),在这里您可以找到Type、Refinment、nl和其他在Scala中使用的东西。
至于EBNF it self,这里是它的语法的完整表:
Usage Notation
definition =
concatenation ,
termination ;
alternation |
option [ ... ]
repetition { ... }
grouping ( ... )
terminal string " ... "
terminal string ' ... '
comment (* ... *)
special sequence ? ... ?
exception -SLS中的符号略有修改,即使用::=代替简单的=和用于级联的空间而不是,。
https://stackoverflow.com/questions/19375471
复制相似问题