「Spec2.8ChapAa」の編集履歴(バックアップ)一覧はこちら
Spec2.8ChapAa - (2011/02/16 (水) 10:32:28) の最新版との変更点
追加された行は緑色になります。
削除された行は赤色になります。
#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]]}
#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]]}