语法

parser grammar SolidityParser

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

rule source-unit

在顶层,Solidity允许pragmas,导入语句, 以及合约,接口,库,结构,枚举和常量的定义。

pragmapragma-token;import-directiveusing-directivecontract-definitioninterface-definitionlibrary-definitionfree-function-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

可以在合约,接口和库中使用的声明。

注意,接口和库不能包含构造函数,接口不能包含状态变量, 库不能包含fallback,receive函数和非恒定状态变量。

constructor-definitioncontract-function-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

函数类型的状态可变性。 如果没有指定可变性,则假定默认的可变性为 “非payable“。

pureviewpayable

rule override-specifier
一个用于函数,修改器或状态变量的重载指定符。

如果在被重载的几个基础合约中存在不明确的声明, 必须给出一个完整的基础合约清单。

override(identifier-path,)

rule contract-function-definition

合约,库和接口功能的定义。 根据定义函数的上下文,可能会有进一步的限制。 例如,接口中的函数必须是未实现的,也就是说,不能包含主体块。

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

rule free-function-definition

自由函数的定义。

functionidentifierfallbackreceive(parameter-list)state-mutabilityreturns(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

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

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{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

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

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

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

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

一个发射语句。包含的表达式需要引用一个事件。

emitexpressioncall-argument-list;

rule revert-statement

一个恢复语句。包含的表达式需要指向一个错误。

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循环中有效。 离开语句只在函数体内有效。

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]

rule double-quoted-printable

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

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

rule escape-sequence

转义序列。 除了常见的单字符转义序列外,还可以转义换行, 以及允许四个十六进制数字的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]

rule unicode-string-literal

单引号字符串字面量,允许任意的unicode字符。

'unicode''"'~["\r\n\\]escape-sequence'"''\''~['\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

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中的十六进制字由一个前缀和一个或多个十六进制数字组成。

'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

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