言語の文法

parser grammar SolidityParser

Solidityは、Ethereumプラットフォーム上でスマートコントラクトを実装するための、静的型付けでコントラクト指向の高水準言語です。

rule source-unit

Solidityでは、プラグマ、importディレクティブ、コントラクト、インターフェース、ライブラリ、構造体、列挙型、定数などの定義が可能です。

pragmapragma-token;import-directiveusing-directivecontract-definitioninterface-definitionlibrary-definitionfunction-definitionconstant-variable-declarationstruct-definitionenum-definitionuser-defined-value-type-definitionerror-definitioneof

rule import-directive

importディレクティブは、異なるファイルから識別子をインポートします。

importpathasidentifiersymbol-aliasesfrompath*asidentifierfrompath;

rule path

インポートするファイルのパス。

non-empty-string-literal

rule symbol-aliases

インポートするシンボルのエイリアスのリスト。

{identifierasidentifier,}

rule contract-definition

コントラクトのトップレベルの定義。

abstractcontractidentifierisinheritance-specifier,{contract-body-element}

rule interface-definition

インターフェースのトップレベルの定義。

interfaceidentifierisinheritance-specifier,{contract-body-element}

rule library-definition

ライブラリのトップレベルの定義。

libraryidentifier{contract-body-element}

rule inheritance-specifier

コントラクトとインターフェースの継承指定子です。 オプションでベースコンストラクタの引数を与えることができます。

identifier-pathcall-argument-list

rule contract-body-element

コントラクト、インターフェース、ライブラリで使用可能な宣言。

インターフェースとライブラリはコンストラクタを含むことができず、インターフェースは状態変数を含むことができず、ライブラリはフォールバック、receive関数、非定数の状態変数を含むことができないことに注意してください。

constructor-definitionfunction-definitionmodifier-definitionfallback-function-definitionreceive-function-definitionstruct-definitionenum-definitionuser-defined-value-type-definitionstate-variable-declarationevent-definitionerror-definitionusing-directive

rule call-argument-list

関数や類似の呼び出し可能なオブジェクトを呼び出す際の引数。 引数はカンマで区切られたリストか、名前付き引数のマップとして与えられます。

(expression,{identifier:expression,})

rule identifier-path

適格な名称。

identifier.

rule modifier-invocation

モディファイアの呼び出し。 モディファイアが引数を取らない場合、引数リストは完全にスキップすることができます(開閉括弧を含む)。

identifier-pathcall-argument-list

rule visibility

関数と関数型のビジビリティ。

internalexternalprivatepublic

rule parameter-list

関数の引数や戻り値などのパラメータのリスト。

type-namedata-locationidentifier,

rule constructor-definition

コンストラクタの定義。 常に実装を提供する必要があります。 internalあるいはpublicの指定は非推奨であることに注意してください。

constructor(parameter-list)modifier-invocationpayableinternalpublicblock

rule state-mutability

関数型に対するミュータビリティの指定。 ミュータビリティが指定されていない場合は、デフォルトのミュータビリティ「non-payable」が指定される。

pureviewpayable

rule override-specifier

関数、モディファイア、状態変数に使用されるオーバーライド指定子。 オーバーライドされる複数のベースコントラクトにあいまいな宣言がある場合、基本コントラクトの完全なリストを指定する必要があります。

override(identifier-path,)

rule function-definition

コントラクト関数、ライブラリ関数、インターフェース関数、フリー関数の定義。 関数が定義されているコンテキストによっては、さらなる制約が適用される場合があります。 例えば、インターフェイスの関数は未実装、つまりボディブロックを含んではなりません。

functionidentifierfallbackreceive(parameter-list)visibilitystate-mutabilitymodifier-invocationvirtualoverride-specifierreturns(parameter-list);block

rule modifier-definition

モディファイアの定義。 モディファイアの本体ブロック内では、アンダースコアは識別子として使用できませんが、モディファイアが適用される関数本体のプレースホルダー文として使用できることに注意してください。

modifieridentifier(parameter-list)virtualoverride-specifier;block

rule fallback-function-definition

fallback関数の定義。

fallback(parameter-list)externalstate-mutabilitymodifier-invocationvirtualoverride-specifierreturns(parameter-list);block

rule receive-function-definition

receive関数の定義。

receive()externalpayablemodifier-invocationvirtualoverride-specifier;block

rule struct-definition

構造体の定義。ソースユニット、コントラクト、ライブラリ、インターフェースのトップレベルで定義できます。

structidentifier{struct-member}

rule struct-member

名前付き構造体メンバの宣言。

type-nameidentifier;

rule enum-definition

enumの定義。ソースユニット、コントラクト、ライブラリ、インターフェースのトップレベルで定義できます。

enumidentifier{identifier,}

rule user-defined-value-type-definition

ユーザー定義の値型を定義。ソースユニット、コントラクト、ライブラリ、インターフェースのトップレベルで定義できます。

typeidentifieriselementary-type-name;

rule state-variable-declaration

状態変数の宣言。

type-namepublicprivateinternalconstantoverride-specifierimmutableidentifier=expression;

rule constant-variable-declaration

定数変数の宣言。

type-nameconstantidentifier=expression;

rule event-parameter

イベントのパラメータ。

type-nameindexedidentifier

rule event-definition

イベントの定義。コントラクト、ライブラリ、インターフェースで定義できます。

eventidentifier(event-parameter,)anonymous;

rule error-parameter

エラーのパラメータ。

type-nameidentifier

rule error-definition

エラーの定義。

erroridentifier(error-parameter,);

rule user-definable-operator

Operators that users are allowed to implement for some types with using for.

&~|^+/%*-==>>=<<=!=

rule using-directive

Using directive to attach library functions and free functions to types. Can occur within contracts and libraries and at the file level.

usingidentifier-path{identifier-pathasuser-definable-operator,}for*type-nameglobal;

rule type-name

型名には、基本型、関数型、マッピング型、ユーザ定義型(コントラクトや構造体など)、配列型があります。

elementary-type-namefunction-type-namemapping-typeidentifier-pathtype-name[expression]

rule elementary-type-name

addressaddresspayableboolstringbytessigned-integer-typeunsigned-integer-typefixed-bytesfixedufixed

rule function-type-name

function(parameter-list)visibilitystate-mutabilityreturns(parameter-list)

rule variable-declaration

単一の変数の宣言。

type-namedata-locationidentifier

rule data-location

memorystoragecalldata

rule expression

複合式。 インデックスアクセス、インデックス範囲アクセス、メンバーアクセス、関数呼び出し(関数呼び出しオプション付き)、型変換、単項式または二項式、比較または代入、三項式、new式(コントラクトの作成または動的メモリ配列の割り当て)、タプル、インライン配列、一次式(識別子、リテラル、型名など)であることが可能です。

expression[expression]expression[expression:expression]expression.identifieraddressexpression{identifier:expression,}expressioncall-argument-listpayablecall-argument-listtype(type-name)++--!~delete-expressionexpression++--expression**expressionexpression*/%expressionexpression+-expressionexpression<<>>>>>expressionexpression&expressionexpression^expressionexpression|expressionexpression<><=>=expressionexpression==!=expressionexpression&&expressionexpression||expressionexpression?expression:expressionexpression=|=^=&=<<=>>=>>>=+=-=*=/=%=expressionnewtype-nametuple-expressioninline-array-expressionidentifierliteralliteral-with-sub-denominationelementary-type-name

rule tuple-expression

(expression,)

rule inline-array-expression

インライン配列式は、含まれる式の共通型の静的な大きさの配列を示します。

[expression,]

rule identifier

通常の非キーワード識別子以外に、'from' や 'error' などのキーワードも識別子として使用することができます。

identifierfromerrorrevertglobal

rule literal

string-literalnumber-literalboolean-literalhex-string-literalunicode-string-literal

rule literal-with-sub-denomination

number-literalsub-denomination

rule boolean-literal

truefalse

rule string-literal

完全な文字列リテラルは、1つまたは複数の連続した引用符で囲まれた文字列で構成されています。

non-empty-string-literalempty-string-literal

rule hex-string-literal

1つまたは複数の連続した16進文字列で構成される完全な16進文字列リテラル。

hex-string

rule unicode-string-literal

1つまたは複数の連続したUnicode文字列で構成される完全なUnicode文字列リテラル。

unicode-string-literal

rule number-literal

数値リテラルは10進数または16進数で、単位は任意です。

decimal-numberhex-number

rule block

波括弧で囲まれた文のブロック。独自のスコープを持ちます。

{statementunchecked-block}

rule unchecked-block

uncheckedblock

rule statement

blockvariable-declaration-statementexpression-statementif-statementfor-statementwhile-statementdo-while-statementcontinue-statementbreak-statementtry-statementreturn-statementemit-statementrevert-statementassembly-statement

rule if-statement

if文。else部はオプション。

if(expression)statementelsestatement

rule for-statement

for文。init、condition、post-loop部はオプション。

for(variable-declaration-statementexpression-statement;expression-statement;expression)statement

rule while-statement

while(expression)statement

rule do-while-statement

dostatementwhile(expression);

rule continue-statement

continue文。for、while、do-whileループ内でのみ使用可能。

continue;

rule break-statement

break文。for、while、do-whileループ内でのみ使用可能。

break;

rule try-statement

try文。含まれる式は、外部関数呼び出しまたはコントラクトの作成である必要があります。

tryexpressionreturns(parameter-list)blockcatch-clause

rule catch-clause

try文のcatch句。

catchidentifier(parameter-list)block

rule return-statement

returnexpression;

rule emit-statement

emit文。含まれる式は、イベントを参照する必要があります。

emitexpressioncall-argument-list;

rule revert-statement

revert文。含まれる式は、エラーを参照する必要があります。

revertexpressioncall-argument-list;

rule assembly-statement

インラインアセンブリブロック。 インラインアセンブリブロックのコンテンツは、別の字句解析器(scanner/lexer)を使用します。 つまり、インラインアセンブリブロックの内部では、キーワードと許可された識別子のセットが異なります。

assembly'"evmasm"'assembly-flags{yul-statement}

rule assembly-flags

Assembly flags. Comma-separated list of double-quoted strings as flags.

(assembly-flag-string,)

rule variable-declaration-tuple

変数宣言で使用される変数名のタプルです。 空のフィールドを含むことができます。

(,variable-declaration,variable-declaration)

rule variable-declaration-statement

変数宣言文。 単一の変数は初期値なしで宣言できますが、変数のタプルは初期値付きでしか宣言できません。

variable-declaration=expressionvariable-declaration-tuple=expression;

rule expression-statement

expression;

rule mapping-type

mapping(mapping-key-typeidentifier=>type-nameidentifier)

rule mapping-key-type

マッピングのキーとして使用できるのは、基本型またはユーザー定義型のみです。

elementary-type-nameidentifier-path

rule yul-statement

インラインアセンブリブロック内のYul文。 continue文とbreak文は、forループ内でのみ有効です。 leave文は、関数のボディの中でのみ有効です。

yul-blockyul-variable-declarationyul-assignmentyul-function-callyul-if-statementyul-for-statementyul-switch-statementleavebreakcontinueyul-function-definition

rule yul-block

{yul-statement}

rule yul-variable-declaration

1つまたは複数のYul変数の宣言で、初期値は任意。 複数の変数が宣言されている場合、初期値として有効なのは関数呼び出しのみです。

letyul-identifier:=yul-expressionletyul-identifier,:=yul-function-call

rule yul-assignment

どんな式でも1つのYul変数に代入できますが、複数代入する場合は右辺に関数呼び出しが必要です。

yul-path:=yul-expressionyul-path,yul-path:=yul-function-call

rule yul-if-statement

ifyul-expressionyul-block

rule yul-for-statement

foryul-blockyul-expressionyul-blockyul-block

rule yul-switch-statement

Yul switch文は、default-caseのみ(非推奨)、または1つ以上のnon-default case(オプションでdefault-caseが続く)から構成できます。

switchyul-expressioncaseyul-literalyul-blockdefaultyul-blockdefaultyul-block

rule yul-function-definition

functionyul-identifier(yul-identifier,)->yul-identifier,yul-block

rule yul-path

インラインアセンブリ内ではドットのない識別子しか宣言できませんが、ドットを含むパスはインラインアセンブリブロックの外の宣言を参照できます。

yul-identifier.yul-identifieryul-evm-builtin

rule yul-function-call

戻り値のある関数の呼び出しは、代入や変数宣言の右辺としてのみ発生します。

yul-identifieryul-evm-builtin(yul-expression,)

rule yul-boolean

truefalse

rule yul-literal

yul-decimal-numberyul-string-literalyul-hex-numberyul-booleanhex-string

rule yul-expression

yul-pathyul-function-callyul-literal

lexer grammar SolidityLexer
rule fixed-bytes

固定長のバイト型。

'bytes1''bytes2''bytes3''bytes4''bytes5''bytes6''bytes7''bytes8''bytes9''bytes10''bytes11''bytes12''bytes13''bytes14''bytes15''bytes16''bytes17''bytes18''bytes19''bytes20''bytes21''bytes22''bytes23''bytes24''bytes25''bytes26''bytes27''bytes28''bytes29''bytes30''bytes31''bytes32'

rule sub-denomination

数値の単位表記。

'wei''gwei''ether''seconds''minutes''hours''days''weeks''years'

rule signed-integer-type

サイズが決められた符号付き整数型。 intはint256のエイリアスです。

'int''int8''int16''int24''int32''int40''int48''int56''int64''int72''int80''int88''int96''int104''int112''int120''int128''int136''int144''int152''int160''int168''int176''int184''int192''int200''int208''int216''int224''int232''int240''int248''int256'

rule unsigned-integer-type

サイズが決められた符号無し整数型。 uintはuint256のエイリアスです。

'uint''uint8''uint16''uint24''uint32''uint40''uint48''uint56''uint64''uint72''uint80''uint88''uint96''uint104''uint112''uint120''uint128''uint136''uint144''uint152''uint160''uint168''uint176''uint184''uint192''uint200''uint208''uint216''uint224''uint232''uint240''uint248''uint256'

rule non-empty-string-literal

印字可能な文字に制限された、クォートで囲まれた空でない文字列リテラル。

'"'double-quoted-printableescape-sequence'"''\''single-quoted-printableescape-sequence'\''

rule empty-string-literal

空の文字列リテラル

'"''"''\'''\''

rule single-quoted-printable

シングルクォート、バックスラッシュ以外の印字可能な文字。

[\u0020-\u0026\u0028-\u005B\u005D-\u007E]

rule double-quoted-printable

ダブルクォート、バックスラッシュ以外の印刷可能な文字。

[\u0020-\u0021\u0023-\u005B\u005D-\u007E]

rule escape-sequence

エスケープシーケンス。 一般的な1文字のエスケープシーケンスとは別に、改行もエスケープできます。 また、4桁の16進数のUnicodeエスケープ uXXXX と2桁の16進数のエスケープシーケンス xXX が使用可能です。

'\\'['"\\nrt\n\r]'u'[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]'x'[0-9A-Fa-f][0-9A-Fa-f]

rule unicode-string-literal

任意のUnicode文字を使用できるシングルクォートで囲まれた文字列リテラル。

'unicode''"'~["\r\n\\]escape-sequence'"''\''~['\r\n\\]escape-sequence'\''

rule hex-string

16進文字列は、偶数長の16進数の数字で構成され、アンダースコアを用いてグループ化できる必要があります。

'hex''"'[0-9A-Fa-f][0-9A-Fa-f]'_''"''\''[0-9A-Fa-f][0-9A-Fa-f]'_''\''

rule hex-number

16進数は、プレフィックスと、アンダースコアで区切られた任意の数の16進数の数字で構成されています。

'0''x'[0-9A-Fa-f]'_'

rule decimal-number

10進数リテラルは、アンダースコアで区切られた10進数の数字と、オプションで正または負の指数で構成されています。 桁に小数点が含まれている場合、リテラルは固定小数点型となります。

[0-9]'_'[0-9]'_''.'[0-9]'_'[eE]'-'[0-9]'_'

rule identifier

Solidityの識別子は、アルファベット、ドル記号、アンダースコアで始まる必要があり、最初の記号の後であれば数字を含むことができます。

[a-zA-Z$_][a-zA-Z0-9$_]

rule yul-evm-builtin

EVMのオペコードに対応するYulのビルトイン関数。

'stop''add''sub''mul''div''sdiv''mod''smod''exp''not''lt''gt''slt''sgt''eq''iszero''and''or''xor''byte''shl''shr''sar''addmod''mulmod''signextend''keccak256''pop''mload''mstore''mstore8''sload''sstore''msize''gas''address''balance''selfbalance''caller''callvalue''calldataload''calldatasize''calldatacopy''extcodesize''extcodecopy''returndatasize''returndatacopy''extcodehash''create''create2''call''callcode''delegatecall''staticcall''return''revert''selfdestruct''invalid''log0''log1''log2''log3''log4''chainid''origin''gasprice''blockhash''coinbase''timestamp''number''difficulty''prevrandao''gaslimit''basefee'

rule yul-identifier

Yul識別子は、アルファベット、ドル記号、アンダースコア、数字で構成されますが、数字で始めることはできません。 インラインアセンブリでは、ユーザー定義識別子にドットを使用することはできません。 ドットを含む識別子で構成される式については、yulPathを参照してください。

[a-zA-Z$_][a-zA-Z0-9$_]

rule yul-hex-number

Yulの16進数リテラルは、プレフィックスと1桁以上の16進数で構成されています。

'0''x'[0-9a-fA-F]

rule yul-decimal-number

Yulの10進数リテラルは、0または先頭の0を除いた任意の10進数の数字列です。

'0'[1-9][0-9]

rule yul-string-literal

Yulの文字列リテラルは、1つ以上のダブルクォートまたはシングルクォートで囲まれた文字列からなり、それぞれエスケープされていない改行やエスケープされていないダブルクォートやシングルクォート以外のエスケープシーケンスや印字可能な文字が含まれることがある。

'"'double-quoted-printableescape-sequence'"''\''single-quoted-printableescape-sequence'\''

rule pragma-token

Pragmaトークン。 セミコロン以外のあらゆる種類の記号を含むことができます。 現在、Solidityパーサーはこのサブセットしか許さないことに注意してください。