アットウィキロゴ

Spec2.8ChapAa

「Spec2.8ChapAa」の編集履歴(バックアップ)一覧に戻る

Spec2.8ChapAa - (2011/02/23 (水) 18:43:08) のソース

#setmenu2(spec2.8-r-menu)

* 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 章の記述と合致していない。


&br()
&br()

* 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

#center(){[[前:12章>Spec2.8Chap12b]] [[目次>Spec2.8和訳]] [[次:ChapB>Spec2.8ChapBa]]}
ツールボックス

下から選んでください:

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