语言语法

parser grammar SolidityParser

Solidity 是一种静态类型、面向合约的高级语言,用于在以太坊平台上实现智能合约。

rule source-unit

在顶层,Solidity 允许使用 pragma、导入指令以及合约、接口、库、结构、枚举和常量的定义。

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

rule import-directive

导入指令从不同的文件中导入标识符。

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

合约、接口和库中可使用的声明。

请注意,接口和库可能不包含构造函数,接口可能不包含状态变量,库可能不包含回退函数、接收函数或非常量状态变量。

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(parameter-list)externalstate-mutabilitymodifier-invocationvirtualoverride-specifierreturns(parameter-list);block

rule receive-function-definition

特殊接收函数的定义。

receive()externalpayablemodifier-invocationvirtualoverride-specifier;block

rule struct-definition

结构的定义。可以出现在源单元的顶层,也可以出现在合约、库或接口中。

structidentifier{struct-member}

rule struct-member

命名结构成员的声明。

type-nameidentifier;

rule enum-definition

枚举的定义。可以出现在源单元的顶层,也可以出现在合约、库或接口中。

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

用户可以使用 using for 为某些类型实现的操作符。

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

rule using-directive

使用指令将库函数和自由函数附加到类型。可以出现在合约和库中,以及在文件级别。

usingidentifier-path{using-aliases,}for*type-nameglobal;

rule using-aliases

identifier-pathasuser-definable-operator

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

复杂表达式。可以是索引访问、索引范围访问、成员访问、函数调用(带可选的函数调用选项)、类型转换、一元或二元表达式、比较或赋值、三元表达式、新建表达式(即合约创建或动态内存数组的分配)、元组、内联数组或主表达式(即标识符、字面量或类型名称)。

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

完整的字符串字面量由一个或多个连续的引号字符串组成。

non-empty-string-literalempty-string-literal

rule hex-string-literal

完整的十六进制字符串字面量,由一个或多个连续的十六进制字符串组成。

hex-string

rule unicode-string-literal

完整的Unicode字符串字面量,由一个或多个连续的Unicode字符串组成。

unicode-string-literal

rule number-literal

数字字面量可以是十进制或十六进制数字,并带有一个可选的单位。

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语句,带可选的初始化、条件和循环后部分。

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

内联汇编块。内联汇编块的内容使用单独的扫描器/词法分析器,即内联汇编块中的关键字和允许的标识符集不同。

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

rule assembly-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

一个或多个Yul变量的声明,带可选的初始值。如果声明了多个变量,则只有函数调用才是有效的初始值。

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

rule yul-assignment

任何表达式都可以赋值给单个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语句可以仅由默认情况(已弃用)组成,或者由一个或多个非默认情况组成,后面可选地跟着一个默认情况。

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]

规则 双引号可打印

除双引号或反斜杠之外的任何可打印字符。

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

规则 转义序列

转义序列。除了常见的单字符转义序列外,换行符也可以转义,以及四位十六进制 unicode 转义序列 \uXXXX 和两位十六进制转义序列 \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]

规则 unicode 字符串文字

一个单引号字符串文字,允许任意 unicode 字符。

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

规则 十六进制字符串

十六进制字符串需要由偶数个十六进制数字组成,这些数字可以使用下划线进行分组。

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

规则 十六进制数字

十六进制数字由一个前缀和任意数量的十六进制数字组成,这些数字可以使用下划线分隔。

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

规则 十进制数字

十进制数字文字由十进制数字组成,这些数字可以使用下划线分隔,并带有一个可选的正或负指数。如果数字包含小数点,则文字具有定点类型。

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

规则 标识符

Solidity 中的标识符必须以字母、美元符号或下划线开头,并且可以在第一个符号之后包含数字。

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

规则 yul-evm 内置函数

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''tload''tstore''msize''gas''address''balance''selfbalance''caller''callvalue''calldataload''calldatasize''calldatacopy''extcodesize''extcodecopy''returndatasize''returndatacopy''mcopy''extcodehash''create''create2''call''callcode''delegatecall''staticcall''return''revert''selfdestruct''invalid''log0''log1''log2''log3''log4''chainid''origin''gasprice''blockhash''blobhash''coinbase''timestamp''number''difficulty''prevrandao''gaslimit''basefee''blobbasefee'

规则 yul 标识符

Yul 标识符由字母、美元符号、下划线和数字组成,但不能以数字开头。在内联汇编中,用户定义的标识符中不能包含点。而是参见 yulPath,用于包含带点的标识符的表达式。

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

规则 yul 十六进制数字

Yul 中的十六进制文字由一个前缀和一个或多个十六进制数字组成。

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

规则 yul 十进制数字

Yul 中的十进制文字可以是零或任何不含前导零的十进制数字序列。

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

规则 yul 字符串文字

Yul 中的字符串文字由一个或多个双引号或单引号字符串组成,这些字符串可以包含转义序列和可打印字符,但不包含未转义的换行符或未转义的双引号或单引号。

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

规则 pragma 令牌

Pragma 令牌。可以包含任何类型的符号,但分号除外。请注意,目前 Solidity 解析器只允许此功能的子集。