Spec2.8ChapAa

Chapter A Scala 文法要約

(訳注:前半は日本語訳、後半は英語原文を記載。 資料にはないがドキュメント本文には出てくる hexDigit を追加。 クラスパラメータリストの区切りは ','に修正して掲載)

次は、Scala の字句構文を EBNF記法で記述している。

大文字             ::=   'A' | … | 'Z' | '$' | '_' と ユニコードカテゴリ Lu
小文字             ::=   'a' | … | 'z' と ユニコードカテゴリ Ll
文字               ::=   大文字 | 小文字 と ユニコードカテゴリ Lo, Lt, Nl
数字               ::=   '0' | … | '9'
演算子文字         ::=   "\u0020-007F 中の他の全ての文字と、ユニコードカテゴリ
                         Sm、So。ただし括弧([])およびピリオドを除く" (*1)
                
演算子             ::=   演算子文字 {演算子文字}
変数識別子         ::=   小文字 識別子文字列
一般識別子         ::=   大文字 識別子文字列
                     |   変数識別子
                     |   記号
識別子             ::=   一般識別子
                     |   '\`' stringLit '\`'
識別子文字列       ::=   {文字 | 数字} ['_' 記号]
                
整数リテラル       ::=   (10進数値 | 16進数値 | 8進数値) ['L' | 'l']
10進数値           ::=   '0' | 非0数字 {数字}
16進数値           ::=   '0' 'x' 16進数字 {16進数字}
8進数値            ::=   '0' 8進数字 {8進数字}
数字               ::=   '0' | 非0数字
非0数字            ::=   '1' | … | '9'
8進数字            ::=   '0' | … | '7'
16進数字           ::=   '0' | … | '9' | 'A' | … | 'F' | 'a' | … | 'f' |
浮動小数点リテラル ::=   数字 {数字} '.' {数字} [指数部] [浮動型]
                     |   '.' 数字 {数字} [指数部] [浮動型]
                     |   数字 {数字} 指数部 [浮動型]
                     |   数字 {数字} [指数部] 浮動型
指数部             ::=   ('E' | 'e') ['+' | '-'] 数字 {数字}
浮動型             ::=   'F' | 'f' | 'D' | 'd'
                  
ブーリアンリテラル ::=   'true' | 'false'
                  
文字リテラル       ::=   '\'' printableChar '\''
                     |   '\'' charEscapeSeq '\''
                  
文字列リテラル     ::=   '"' {文字列要素} '"'
                     |   '"""' 複数行文字 '"""'
文字列要素         ::=   printableCharNoDoubleQuote
                     |   charEscapeSeq
複数行文字         ::=   {['"'] ['"'] charNoDoubleQuote} {'"'}
                  
シンボルリテラル   ::=   ''' 一般識別子
                
コメント           ::=   '/*' "文字の任意の並び" '*/'
                     |   '//' "行末までの、文字の任意の並び"
                  
改行区切り         ::=   "改行文字"
複文区切り         ::=   ';' | 改行区切り {改行区切り}
                  
                  

次は、Scala の自由文脈文法を EBNF記法で記述している。

リテラル          ::=   ['-'] 整数リテラル
                    |   ['-'] 浮動小数点リテラル
                    |   ブーリアンリテラル
                    |   文字リテラル
                    |   文字列リテラル
                    |   シンボルリテラル
                    |   'null'
                   
限定識別子        ::=   識別子 {'.' 識別子}
識別子リスト      ::=   識別子 {',' 識別子}
                   
パス              ::=   安定識別子
                    |   [識別子 '.'] 'this'
安定識別子        ::=   識別子
                    |   パス '.' 識別子
                    |   [識別子 '.'] 'super' [クラス明示子] '.' 識別子
クラス明示子      ::=   '[' 識別子 ']'
                   
型                ::=   関数引数型 '=>' 型
                    |   中置型 [存在節]
関数引数型        ::=   中置型
                    |   '(' [ パラメータ型 {',' パラメータ型 } ] ')'
存在節            ::=   'forSome' '{' 存在宣言 {複文区切り 存在宣言} '}'
存在宣言          ::=   'type' 型宣言
                    |   'val' Val宣言
中置型            ::=   複合型 {識別子 [改行区切り] 複合型}
複合型            ::=   アノテーション型 {'with' アノテーション型} [細別]
                    |   細別
アノテーション型  ::=   単純型 {アノテーション}
単純型            ::=   単純型 型引数
                    |   単純型 '#' 識別子
                    |   安定識別子
                    |   パス '.' 'type'
                    |   '(' 型リスト ')'
型引数         ::=   '[' 型リスト ']'
型リスト       ::=   型 {',' 型}
細別           ::=   [改行区切り] '{' 細別文 {複文区切り 細別文} '}'
細別文         ::=   宣言
                 |   'type' 型定義
                 |
型パターン     ::=   型
                   
帰属           ::=   ':' 中置型
                 |   ':' アノテーション {アノテーション}
                 |   ':' '_' '*'
                   
式             ::=   (名前束縛リスト | ['implicit'] 識別子 | '_') '=>' 式
                 |   式1
式1            ::=   'if' '(' 式 ')' {改行区切り} 式 [[複文区切り] else 式]
                 |   'while' '(' 式 ')' {改行区切り} 式
                 |   'try' '{' ブロック '}' ['catch' '{' ケース節リスト '}']
                     ['finally' 式]
                 |   'do' 式 [複文区切り] 'while' '(' 式 ')'
                 |   'for' ('(' 列挙子リスト ')' | '{' 列挙子リスト '}')
                     {改行区切り} ['yield'] 式
                 |   'throw' 式
                 |   'return' [式]
                 |   [単純式 '.'] 識別子 '=' 式
                 |   単純式1 引数式リスト '=' 式
                 |   後置式
                 |   後置式 帰属
                 |   後置式 'match' '{' ケース節リスト '}'
後置式         ::=   中置式 [識別子 [改行区切り]]
中置式         ::=   前置式
                 |   中置式 識別子 [改行区切り] 中置式
前置式         ::=   ['-' | '+' | '~' | '!'] 単純式
単純式         ::=   'new' (クラステンプレート | テンプレート本体)
                 |   ブロック式
                 |   単純式1 ['_']
単純式1        ::=   リテラル
                 |   パス
                 |   '_'
                 |   '(' [式リスト] ')'
                 |   単純式 '.' 識別子
                 |   単純式 型引数
                 |   単純式1 引数式リスト
                 |   XmlExpr
式リスト       ::=   式 {',' 式}
引数式リスト   ::=   '(' [式リスト] ')'
                 |   [改行区切り] ブロック式
ブロック式     ::=   '{' ケース節リスト '}'
                 |   '{' ブロック '}'
ブロック       ::=   {ブロック文 複文区切り} [結果式]
ブロック文     ::=   インポート
                 |   {アノテーション} ['implicit' | 'lazy'] 定義
                 |   {アノテーション} {ローカル修飾子} テンプレート定義
                 |   式1
                 |
結果式         ::=  式1
                 |  (名前束縛リスト | (識別子 | '_') ':' 複合型) '=>' ブロック
                   
列挙子リスト   ::=   生成子 {複文区切り 列挙子}
列挙子         ::=   生成子
                 |   ガード
                 |   'val' パターン1 '=' 式
生成子         ::=   パターン1 '<-' 式 [ガード]
                   
ケース節リスト ::=   ケース節 { ケース節 }
ケース節       ::=   'case' パターン [ガード] '=>' ブロック
ガード         ::=   'if' 後置式
                   
パターン       ::=   パターン1 { '|' パターン1 }
パターン1      ::=   変数識別子 ':' 型パターン
                 |   '_' ':' 型パターン
                 |   パターン2
パターン2      ::=   変数識別子 ['@' パターン3]
                 |   パターン3
パターン3      ::=   単純パターン
                 |   単純パターン { 識別子 [改行区切り] 単純パターン }
単純パターン 
          ::=   '_'
            |  変数識別子
            |  リテラル
            |  安定識別子
            |  安定識別子 '(' [パターンリスト ')'
            |  安定識別子 '(' [パターンリスト ','] [変数識別子 '@'] '_' '*' ')'
            |  '(' [パターンリスト] ')'
            |  XmlPattern
パターンリスト     ::=   パターン [',' パターンリスト]
                     |   '_' *
型パラメータ節     ::=   '[' 変位型パラメータ {',' 変位型パラメータ} ']'
関数型パラメータ節 ::=   '[' 型パラメータ {',' 型パラメータ} ']'
変位型パラメータ   ::=   {アノテーション} ['+' | '-'] 型パラメータ
型パラメータ       ::=   (識別子 | '_') [型パラメータ節] ['>:' 型] ['<:' 型]
                         {'<%' 型} {':' 型}
パラメータ節リスト ::=   {パラメータ節} 
                         [[改行区切り] '(' 'implicit' パラメータリスト ')']
パラメータ節       ::=   [改行区切り] '(' [パラメータリスト] ')'
パラメータリスト   ::=   パラメータ {',' パラメータ}
パラメータ         ::=   {アノテーション} 識別子 [':' パラメータ型] ['=' 式]
パラメータ型       ::=   型
                     |   '=>' 型
                     |   型 '*'
クラスパラメータ節リスト  
               ::=  {クラスパラメータ節}
                    [[改行区切り] '(' 'implicit' クラスパラメータリスト ')']
クラスパラメータ節 ::=   [改行区切り] '(' [クラスパラメータリスト] ')'
クラスパラメータリスト 
                   ::=   クラスパラメータ {',' クラスパラメータ} 
クラスパラメータ   ::=   {アノテーション} [{修飾子} ('val' | 'var')]
                         識別子 ':' パラメータ型 ['=' 式]
名前束縛リスト     ::=   '(' 名前束縛 {',' 名前束縛 ')'
名前束縛           ::=   (識別子 | '_') [':' 型]
 
修飾子             ::=   ローカル修飾子
                     |   アクセス修飾子
                     |   'override'
ローカル修飾子     ::=   'abstract'
                     |   'final'
                     |   'sealed'
                     |   'implicit'
                     |   'lazy'
アクセス修飾子     ::=   ('private' | 'protected') [アクセス限定子]
アクセス限定子     ::=   '[' (識別子 | 'this') ']'

アノテーション                 ::=   '@' 単純型 {引数式リスト}
コンストラクタアノテーション   ::=   '@' 単純型 引数式リスト
名前値ペア         ::=   'val' 識別子 '=' 前置式

テンプレート本体   ::=   [改行区切り] '{' [自己型] テンプレート文 
                         {複文区切り テンプレート文} '}'
テンプレート文     ::=   インポート
                     |   {アノテーション [改行区切り]} {修飾子} 定義
                     |   {アノテーション [改行区切り]} {修飾子} 宣言
                     |   式
                     |
自己型             ::=   識別子 [':' 型] '=>'
                     |   'this' ':' 型 '=>'

インポート    ::=   'import' インポート式 {',' インポート式}
インポート式  ::=   安定識別子 '.' (識別子 | '_' | インポートセレクタリスト)
インポートセレクタリスト 
              ::=   '{' {インポートセレクタ ','} (インポートセレクタ | '_') '}'
インポートセレクタ ::=   識別子 ['=>' 識別子 | '=>' '_']
 
宣言               ::=   'val' Val宣言
                     |   'var' 変数宣言
                     |   'def' 関数宣言
                     |   'type' {改行区切り} 型宣言
 
Val宣言            ::=   識別子リスト ':' 型
変数宣言           ::=   識別子リスト ':' 型
関数宣言           ::=   関数シグニチャ [':' 型]
関数シグニチャ     ::=   識別子 [関数型パラメータ節] パラメータ節リスト
型宣言             ::=   識別子 [型パラメータ節] ['>:' 型] ['<:' 型]
                  
パターン変数定義   ::=   'val' パターン定義
                     |   'var' 変数定義
定義               ::=   パターン変数定義
                     |   'def' 関数定義
                     |   'type' {改行区切り} 型定義
                     |   テンプレート定義
パターン定義       ::=   パターン2 {',' パターン2} [':' 型] '=' 式
変数定義           ::=   パターン定義
                     |   識別子リスト ':' 型 '=' '_'
関数定義      ::=   関数シグニチャ [':' 型] '=' 式
                |   関数シグニチャ [改行区切り] '{' ブロック '}'
                |   'this' パラメータ節 パラメータ節リスト
                    ('=' コンストラクタ式 | [改行区切り] コンストラクタブロック)
型定義        ::=   識別子 [型パラメータ節] '=' 型
                  
テンプレート定義   ::=   ['case'] 'class' クラス定義
                     |   ['case'] 'object' オブジェクト定義
                     |   'trait' トレイト定義
クラス定義         ::=   識別子 [型パラメータ節] {コンストラクタアノテーション} 
                         [アクセス修飾子] クラスパラメータ節リスト 
                         クラステンプレートオプション
トレイト定義       ::=   識別子 [型パラメータ節] トレイトテンプレートオプション
オブジェクト定義   ::=   識別子 クラステンプレートオプション
クラステンプレートオプション   
           ::=  'extends' クラステンプレート | [['extends'] テンプレート本体]
トレイトテンプレートオプション 
           ::=  'extends' トレイトテンプレート | [['extends'] テンプレート本体]
クラステンプレート   ::=   [事前定義リスト] 親クラスリスト [テンプレート本体]
トレイトテンプレート ::=   [事前定義リスト] 親トレイトリスト [テンプレート本体]
親クラスリスト       ::=   コンストラクタ {'with' アノテーション型}
親トレイトリスト     ::=   アノテーション型 {'with' アノテーション型}
コンストラクタ       ::=   アノテーション型 {引数式リスト}
事前定義リスト     ::=  '{' [事前定義 {複文区切り 事前定義}] '}' 'with'
事前定義           ::=  {アノテーション [改行区切り]} {修飾子} パターン変数定義
コンストラクタ式       ::=   自己呼出し
                         |   コンストラクタブロック
コンストラクタブロック ::=   '{' 自己呼出し {複文区切り ブロック文} '}'
自己呼出し             ::=   'this' 引数式リスト {引数式リスト}
トップレベル文並び ::=  トップレベル文 {複文区切り トップレベル文}
トップレベル文     ::=  {アノテーション [改行区切り]} {修飾子} テンプレート定義
                     |  インポート
                     |  パッケージング
                     |  パッケージオブジェクト
                     |
 
パッケージング     ::=   'package' 限定識別子 [改行区切り] 
                             '{' トップレベル文並び '}'
パッケージオブジェクト ::=   'package' 'object' オブジェクト定義
 
コンパイル単位     ::=   {'package' 限定識別子 複文区切り} トップレベル文並び

訳注: (*1) 第 1 章の記述と合致していない。



Scala Syntax Summary

The lexical syntax of Scala is given by the following grammar in EBNF form.

upper             ::=   'A' |  ・・・| 'Z' | '$' | '_' and Unicode category Lu
lower             ::=   'a' |  ・・・| 'z' and Unicode category Ll
letter            ::=   upper   | lower and Unicode categories Lo, Lt, Nl
digit             ::=   '0' |  ・・・| '9'
opchar            ::=   "all other characters in \u0020-007F and Unicode
                       categories Sm, So except parentheses ([]) and periods"

op                ::=   opchar {opchar}
varid             ::=   lower idrest
plainid           ::=   upper idrest
                    |   varid
                    |   op
id                ::=   plainid
                    |   '\`' stringLit '\`'
idrest            ::=   {letter | digit} ['_' op]

integerLiteral    ::=   (decimalNumeral | hexNumeral | octalNumeral) ['L' | 'l']
decimalNumeral    ::=   '0' | nonZeroDigit {digit}
hexNumeral        ::=   '0' 'x' hexDigit {hexDigit}
octalNumeral      ::=   '0' octalDigit {octalDigit}
digit             ::=   '0' | nonZeroDigit
nonZeroDigit      ::=   '1' |・・・| '9'
octalDigit        ::=   '0' |・・・| '7'

floatingPointLiteral
                  ::=   digit {digit} '.' {digit} [exponentPart] [floatType]
                    |   '.' digit {digit} [exponentPart] [floatType]
                    |   digit {digit} exponentPart [floatType]
                    |   digit {digit} [exponentPart] floatType
exponentPart      ::=   ('E' | 'e') ['+' | '-'] digit {digit}
floatType         ::=   'F' | 'f' | 'D' | 'd'




booleanLiteral    ::=   'true' | 'false'

characterLiteral  ::=   '\'' printableChar '\''
                    |   '\'' charEscapeSeq '\''

stringLiteral     ::=   '"' {stringElement} '"'
                    |   '"""' multiLineChars '"""'
stringElement     ::=   printableCharNoDoubleQuote
                    |   charEscapeSeq
multiLineChars    ::=   {['"'] ['"'] charNoDoubleQuote} {'"'}

symbolLiteral     ::=   ''' plainid

comment           ::=   '/*' "any sequence of characters" '*/'
                    |   '//' "any sequence of characters up to end of line"

nl                ::=   "new line character"
semi              ::=   ';' |   nl {nl}


The context-free syntax of Scala is given by the following EBNF grammar.


Literal           ::=    ['-'] integerLiteral
                    |    ['-'] floatingPointLiteral
                    |    booleanLiteral
                    |    characterLiteral
                    |    stringLiteral
                    |    symbolLiteral
                    |    'null'
 
QualId            ::=    id {'.' id}
ids               ::=    id {',' id}
 
Path              ::=    StableId
                    |    [id '.'] 'this'
StableId          ::=    id
                    |    Path '.' id
                    |    [id '.'] 'super' [ClassQualifier] '.' id
ClassQualifier    ::=    '[' id ']'

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}
Refinement        ::=   [nl] '{' RefineStat {semi RefineStat} '}'
RefineStat        ::=   Dcl
                    |   'type' TypeDef
                    |
TypePat           ::=   Type
             
Ascription        ::=   ':' InfixType
                    |   ':' Annotation {Annotation}
                    |   ':' '_' '*'
             
Expr              ::=   (Bindings | ['implicit'] id | '_') '=>' Expr
                    |   Expr1
Expr1             ::=   'if' '(' Expr ')' {nl} Expr [[semi] else Expr]
                    |   'while' '(' Expr ')' {nl} Expr
                    |   'try' '{' Block '}' ['catch' '{' CaseClauses '}']
                        ['finally' Expr]
                    |   'do' Expr [semi] 'while' '(' Expr ')'
                    |   'for' ('(' Enumerators ')' | '{' Enumerators '}')
                        {nl} ['yield'] Expr
                    |   'throw' Expr
                    |   'return' [Expr]
                    |   [SimpleExpr '.'] id '=' Expr
                    |   SimpleExpr1 ArgumentExprs '=' Expr
                    |   PostfixExpr
                    |   PostfixExpr Ascription
                    |   PostfixExpr 'match' '{' CaseClauses '}'
PostfixExpr       ::=   InfixExpr [id [nl]]
InfixExpr         ::=   PrefixExpr
                    |   InfixExpr id [nl] InfixExpr
PrefixExpr        ::=   ['-' | '+' | '~' | '!'] SimpleExpr
SimpleExpr        ::=   'new' (ClassTemplate | TemplateBody)
                    |   BlockExpr
                    |   SimpleExpr1 ['_']
SimpleExpr1       ::=   Literal
                    |   Path
                    |   '_'
                    |   '(' [Exprs] ')'
                    |   SimpleExpr '.' id
                    |   SimpleExpr TypeArgs
                    |   SimpleExpr1 ArgumentExprs
                    |    XmlExpr
Exprs             ::=    Expr {',' Expr}
ArgumentExprs     ::=    '(' [Exprs] ')'
                    |    [nl] BlockExpr
BlockExpr         ::=    '{' CaseClauses '}'
                    |    '{' Block '}'
Block             ::=    {BlockStat semi} [ResultExpr]
BlockStat         ::=    Import
                    |    {Annotation} ['implicit' | 'lazy'] Def
                    |    {Annotation} {LocalModifier} TmplDef
                    |    Expr1
                    |
ResultExpr        ::=    Expr1
                    |    (Bindings | (id | '_') ':' CompoundType) '=>' Block

Enumerators       ::=    Generator {semi Enumerator}
Enumerator        ::=    Generator
                    |    Guard
                    |    'val' Pattern1 '=' Expr
Generator         ::=    Pattern1 '<-' Expr [Guard]

CaseClauses       ::=    CaseClause { CaseClause }
CaseClause        ::=    'case' Pattern [Guard] '=>' Block
Guard             ::=    'if' PostfixExpr

Pattern           ::=    Pattern1 { '|' Pattern1 }
Pattern1          ::=    varid ':' TypePat
                    |    '_' ':' TypePat
                    |    Pattern2
Pattern2          ::=    varid ['@' Pattern3]
                    |    Pattern3
Pattern3          ::=    SimplePattern
                    |    SimplePattern { id [nl] SimplePattern }
SimplePattern     ::=    '_'
                    |    varid
                    |    Literal
                    |    StableId
                    |    StableId '(' [Patterns ')'
                    |    StableId '(' [Patterns ','] [varid '@'] '_' '*' ')'
                    |    '(' [Patterns] ')'
                    |    XmlPattern
Patterns          ::=    Pattern [',' Patterns]
                    |    '_' *

TypeParamClause   ::=   '[' VariantTypeParam {',' VariantTypeParam} ']'
FunTypeParamClause::=   '[' TypeParam {',' TypeParam} ']'
VariantTypeParam  ::=   {Annotation} ['+' | '-'] TypeParam
TypeParam         ::=   (id | '_') [TypeParamClause] ['>:' Type] ['<:' Type]
                        {'<%' Type} {':' Type}



ParamClauses      ::=    {ParamClause} [[nl] '(' 'implicit' Params ')']
ParamClause       ::=    [nl] '(' [Params] ')'
Params            ::=    Param {',' Param}
Param             ::=    {Annotation} id [':' ParamType] ['=' Expr]
ParamType         ::=    Type
                    |    '=>' Type
                    |    Type '*'
ClassParamClauses ::=    {ClassParamClause}
                        [[nl] '(' 'implicit' ClassParams ')']
ClassParamClause  ::=   [nl] '(' [ClassParams] ')'
ClassParams       ::=   ClassParam {'' ClassParam}       (訳注:','の誤りか?)
ClassParam        ::=   {Annotation} [{Modifier} ('val' | 'var')]
                        id ':' ParamType ['=' Expr]
Bindings          ::=   '(' Binding {',' Binding ')'
Binding           ::=   (id | '_') [':' Type]

Modifier          ::=   LocalModifier
                    |   AccessModifier
                    |   'override'
LocalModifier     ::=   'abstract'
                    |   'final'
                    |   'sealed'
                    |   'implicit'
                    |   'lazy'
AccessModifier    ::=   ('private' | 'protected') [AccessQualifier]
AccessQualifier   ::=   '[' (id | 'this') ']'

Annotation        ::=   '@' SimpleType {ArgumentExprs}
ConstrAnnotation  ::=   '@' SimpleType ArgumentExprs
NameValuePair     ::=   'val' id '=' PrefixExpr

TemplateBody      ::=   [nl] '{' [SelfType] TemplateStat {semi TemplateStat} '}'
TemplateStat      ::=   Import
                    |   {Annotation [nl]} {Modifier} Def
                    |   {Annotation [nl]} {Modifier} Dcl
                    |   Expr
                    |
SelfType          ::=   id [':' Type] '=>'
                    |   'this' ':' Type '=>'

Import            ::=   'import' ImportExpr {',' ImportExpr}
ImportExpr        ::=   StableId '.' (id | '_' | ImportSelectors)
ImportSelectors   ::=   '{' {ImportSelector ','} (ImportSelector | '_') '}'
ImportSelector    ::=   id ['=>' id | '=>' '_']

Dcl               ::=   'val' ValDcl
                    |   'var' VarDcl
                    |   'def' FunDcl
                    |   'type' {nl} TypeDcl

ValDcl            ::=    ids ':' Type
VarDcl            ::=    ids ':' Type
FunDcl            ::=    FunSig [':' Type]
FunSig            ::=    id [FunTypeParamClause] ParamClauses
TypeDcl           ::=    id [TypeParamClause] ['>:' Type] ['<:' Type]

PatVarDef         ::=    'val' PatDef
                    |    'var' VarDef
Def               ::=    PatVarDef
                    |    'def' FunDef
                    |    'type' {nl} TypeDef
                    |    TmplDef
PatDef            ::=    Pattern2 {',' Pattern2} [':' Type] '=' Expr
VarDef            ::=    PatDef
                    |    ids ':' Type '=' '_'
FunDef            ::=    FunSig [':' Type] '=' Expr
                    |    FunSig [nl] '{' Block '}'
                    |    'this' ParamClause ParamClauses
                         ('=' ConstrExpr | [nl] ConstrBlock)
TypeDef           ::=    id [TypeParamClause] '=' Type

TmplDef           ::=    ['case'] 'class' ClassDef
                    |    ['case'] 'object' ObjectDef
                    |    'trait' TraitDef
ClassDef          ::=  id [TypeParamClause] {ConstrAnnotation} [AccessModifier]
                       ClassParamClauses ClassTemplateOpt
TraitDef          ::=    id [TypeParamClause] TraitTemplateOpt
ObjectDef         ::=    id ClassTemplateOpt
ClassTemplateOpt  ::=    'extends' ClassTemplate | [['extends'] TemplateBody]
TraitTemplateOpt  ::=    'extends' TraitTemplate | [['extends'] TemplateBody]
ClassTemplate     ::=    [EarlyDefs] ClassParents [TemplateBody]
TraitTemplate     ::=    [EarlyDefs] TraitParents [TemplateBody]
ClassParents      ::=    Constr {'with' AnnotType}
TraitParents      ::=    AnnotType {'with' AnnotType}
Constr            ::=    AnnotType {ArgumentExprs}
EarlyDefs         ::=   '{' [EarlyDef {semi EarlyDef}] '}' 'with'
EarlyDef          ::=    {Annotation [nl]} {Modifier} PatVarDef

ConstrExpr        ::=   SelfInvocation
                    |   ConstrBlock
ConstrBlock       ::=   '{' SelfInvocation {semi BlockStat} '}'
SelfInvocation    ::=   'this' ArgumentExprs {ArgumentExprs}

TopStatSeq        ::=    TopStat {semi TopStat}
TopStat           ::=    {Annotation [nl]} {Modifier} TmplDef
                    |    Import
                    |    Packaging
                    |    PackageObject
                    |
Packaging         ::=   'package' QualId [nl] '{' TopStatSeq '}'
PackageObject     ::=   'package' 'object' ObjectDef

CompilationUnit   ::=   {'package' QualId semi} TopStatSeq

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2011年02月23日 18:43
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。