Spec2.8ChapAa

「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]]}

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

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