语言语法

parser grammar SolidityParser

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

rule source-unit

在顶层,坚固性允许编译指示、导入指令以及合同、接口、库、结构、枚举和常量的定义。

pragmapragma-token;import-directivecontract-definitioninterface-definitionlibrary-definitionfunction-definitionconstant-variable-declarationstruct-definitionenum-definitionuser-defined-value-type-definitionerror-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

构造函数的定义。必须始终提供一个实现。请注意,不推荐指定内部或公共可见性。

constructor(parameter-list)modifier-invocationpayableinternalpublicblock

rule state-mutability

函数类型的状态可变性。如果未指定可变性,则假定默认可变性为“不可支付”。

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 using-directive

使用指令将库函数绑定到类型。可以在合同和库中发生。

usingidentifier-pathfor*type-name;

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-expressionidentifierliteralelementary-type-name

rule tuple-expression

(expression,)

rule inline-array-expression

内联数组表达式表示包含表达式的公共类型的静态大小的数组。

[expression,]

rule identifier

除了常规的非关键字标识符,一些关键字,如‘From’和‘Error’也可以用作标识符。

identifierfromerrorrevert

rule literal

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

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-numbernumber-unit

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

带有可选else部分的If语句。

if(expression)statementelsestatement

rule for-statement

具有可选init、condition和post循环部分的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

继续陈述。只允许在for、while或do while循环内。

continue;

rule break-statement

中断声明。只允许在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

还原声明。包含的表达式需要引用错误。

revertexpressioncall-argument-list;

rule assembly-statement

内联装配块。内联汇编块的内容使用单独的scanner/lexer,也就是说,内联汇编块中的关键字和允许的标识符集是不同的。

assembly'"evmasm"'{yul-statement}

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-type=>type-name)

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语句只能由一个default case(已弃用)或一个或多个非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.

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 number-unit

数字的单位名称。

'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

转义序列。除了常见的单字符转义序列外,还可以转义换行符,以及允许使用四个十六进制数字的unicode转义符\uxxx和两个数字的十六进制转义序列\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'"''unicode\''~['\r\n\\]escape-sequence'\''

rule hex-string

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

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

rule hex-number

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

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

rule decimal-number

十进制数文本由十进制数字组成,可以用下划线分隔,还可以选择正指数或负指数。如果数字包含小数点,则文本具有定点类型。

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

rule identifier

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

[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''gaslimit''basefee'

rule yul-identifier

Yul标识符由字母、美元符号、下划线和数字组成,但不能以数字开头。在内联程序集中,用户定义的标识符中不能有点。相反,请参见yulPath以获取由带点的标识符组成的表达式。

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

rule yul-hex-number

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

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

rule yul-decimal-number

Yul中的十进制文本可以是零,也可以是不带前导零的任何十进制数字序列。

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

rule yul-string-literal

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

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

rule pragma-token

Pragma令牌。可以包含除分号以外的任何类型的符号。注意,目前solidity解析器只允许其中的一个子集。