语言语法
- parser grammar SolidityParser
Solidity 是一种静态类型、面向合约的高级语言,用于在以太坊平台上实现智能合约。
- rule source-unit
在顶层,Solidity 允许使用 pragma、导入指令以及合约、接口、库、结构、枚举和常量的定义。
- rule import-directive
导入指令从不同的文件中导入标识符。
- rule path
要导入的文件的路径。
- rule symbol-aliases
要导入的符号的别名列表。
- rule contract-definition
合约的顶层定义。
- rule interface-definition
接口的顶层定义。
- rule library-definition
库的顶层定义。
- rule inheritance-specifier
合约和接口的继承说明符。可以选择提供基构造函数参数。
- rule contract-body-element
合约、接口和库中可使用的声明。
请注意,接口和库可能不包含构造函数,接口可能不包含状态变量,库可能不包含回退函数、接收函数或非常量状态变量。
- rule call-argument-list
调用函数或类似的可调用对象时的参数。参数可以作为逗号分隔的列表或命名参数的映射给出。
- rule identifier-path
限定名。
- rule modifier-invocation
对修饰符的调用。如果修饰符不接受参数,则可以完全跳过参数列表(包括开括号和闭括号)。
- rule visibility
函数和函数类型的可见性。
- rule parameter-list
参数列表,例如函数参数或返回值。
- rule constructor-definition
构造函数的定义。必须始终提供实现。请注意,指定 internal 或 public 可见性已弃用。
- rule state-mutability
函数类型的状态可变性。如果没有指定可变性,则假定默认可变性 ‘non-payable’。
- rule override-specifier
用于函数、修饰符或状态变量的覆盖说明符。在存在多个被覆盖的基类合约中的不明确声明的情况下,必须提供完整的基类合约列表。
- rule function-definition
合约、库、接口或自由函数的定义。根据定义函数的上下文,可能适用进一步的限制,例如,接口中的函数必须是未实现的,即可能不包含主体块。
- rule modifier-definition
修饰符的定义。请注意,在修饰符的主体块中,下划线不能用作标识符,但用作修饰符应用到的函数主体的占位符语句。
- rule fallback-function-definition
特殊回退函数的定义。
- rule receive-function-definition
特殊接收函数的定义。
- rule struct-definition
结构的定义。可以出现在源单元的顶层,也可以出现在合约、库或接口中。
- rule struct-member
命名结构成员的声明。
- rule enum-definition
枚举的定义。可以出现在源单元的顶层,也可以出现在合约、库或接口中。
- rule user-defined-value-type-definition
用户定义值类型的定义。可以出现在源单元的顶层,也可以出现在合约、库或接口中。
- rule state-variable-declaration
状态变量的声明。
- rule constant-variable-declaration
常量变量的声明。
- rule event-parameter
事件的参数。
- rule event-definition
事件的定义。可以出现在合约、库或接口中。
- rule error-parameter
错误的参数。
- rule error-definition
错误的定义。
- rule user-definable-operator
用户可以使用 using for 为某些类型实现的操作符。
- rule using-directive
使用指令将库函数和自由函数附加到类型。可以出现在合约和库中,以及在文件级别。
- rule using-aliases
- rule type-name
类型名可以是基本类型、函数类型、映射类型、用户定义类型(例如合约或结构)或数组类型。
- rule elementary-type-name
- rule function-type-name
- rule variable-declaration
单个变量的声明。
- rule data-location
- rule expression
复杂表达式。可以是索引访问、索引范围访问、成员访问、函数调用(带可选的函数调用选项)、类型转换、一元或二元表达式、比较或赋值、三元表达式、新建表达式(即合约创建或动态内存数组的分配)、元组、内联数组或主表达式(即标识符、字面量或类型名称)。
- rule tuple-expression
- rule inline-array-expression
内联数组表达式表示包含表达式公共类型的静态大小数组。
- rule identifier
除了常规的非关键字标识符外,一些关键字(如“from”和“error”)也可以用作标识符。
- rule literal
- rule literal-with-sub-denomination
- rule boolean-literal
- rule string-literal
完整的字符串字面量由一个或多个连续的引号字符串组成。
- rule hex-string-literal
完整的十六进制字符串字面量,由一个或多个连续的十六进制字符串组成。
- rule unicode-string-literal
完整的Unicode字符串字面量,由一个或多个连续的Unicode字符串组成。
- rule number-literal
数字字面量可以是十进制或十六进制数字,并带有一个可选的单位。
- rule block
由花括号括起来的语句块。打开自己的作用域。
- rule unchecked-block
- rule statement
- rule if-statement
if语句,带可选的else部分。
- rule for-statement
for语句,带可选的初始化、条件和循环后部分。
- rule while-statement
- rule do-while-statement
- rule continue-statement
continue语句。仅允许在for、while或do-while循环内部。
- rule break-statement
break语句。仅允许在for、while或do-while循环内部。
- rule try-statement
try语句。包含的表达式需要是外部函数调用或合约创建。
- rule catch-clause
try语句的catch子句。
- rule return-statement
- rule emit-statement
emit语句。包含的表达式需要引用一个事件。
- rule revert-statement
revert语句。包含的表达式需要引用一个错误。
- rule assembly-statement
内联汇编块。内联汇编块的内容使用单独的扫描器/词法分析器,即内联汇编块中的关键字和允许的标识符集不同。
- rule assembly-flags
汇编标志。用逗号分隔的双引号字符串列表作为标志。
- rule variable-declaration-tuple
用于变量声明的变量名元组。可以包含空字段。
- rule variable-declaration-statement
变量声明语句。一个单独的变量可以声明为没有初始值,而变量元组只能声明为带有初始值。
- rule expression-statement
- rule mapping-type
- rule mapping-key-type
只有基本类型或用户定义类型才适合作为映射键。
- rule yul-statement
内联汇编块中的Yul语句。continue和break语句仅在for循环中有效。leave语句仅在函数体中有效。
- rule yul-block
- rule yul-variable-declaration
一个或多个Yul变量的声明,带可选的初始值。如果声明了多个变量,则只有函数调用才是有效的初始值。
- rule yul-assignment
任何表达式都可以赋值给单个Yul变量,而多重赋值则要求右侧有一个函数调用。
- rule yul-if-statement
- rule yul-for-statement
- rule yul-switch-statement
Yul switch语句可以仅由默认情况(已弃用)组成,或者由一个或多个非默认情况组成,后面可选地跟着一个默认情况。
- rule yul-function-definition
- rule yul-path
虽然只有没有点的标识符可以在内联汇编中声明,但包含点的路径可以引用内联汇编块外部的声明。
- rule yul-function-call
调用带有返回值的函数只能作为赋值或变量声明的右侧出现。
- rule yul-boolean
- rule yul-literal
- rule yul-expression
- lexer grammar SolidityLexer
- rule fixed-bytes
固定长度的字节类型。
- rule sub-denomination
数字的单位分隔符。
- rule signed-integer-type
大小固定的有符号整数类型。int是int256的别名。
- rule unsigned-integer-type
大小固定的无符号整数类型。uint是uint256的别名。
- rule non-empty-string-literal
非空的引号字符串字面量,限制为可打印字符。
- rule empty-string-literal
空字符串字面量
- rule single-quoted-printable
任何可打印字符,除了单引号或反斜杠。
- 规则 双引号可打印
除双引号或反斜杠之外的任何可打印字符。
- 规则 转义序列
转义序列。除了常见的单字符转义序列外,换行符也可以转义,以及四位十六进制 unicode 转义序列 \uXXXX 和两位十六进制转义序列 \xXX 都是允许的。
- 规则 unicode 字符串文字
一个单引号字符串文字,允许任意 unicode 字符。
- 规则 十六进制字符串
十六进制字符串需要由偶数个十六进制数字组成,这些数字可以使用下划线进行分组。
- 规则 十六进制数字
十六进制数字由一个前缀和任意数量的十六进制数字组成,这些数字可以使用下划线分隔。
- 规则 十进制数字
十进制数字文字由十进制数字组成,这些数字可以使用下划线分隔,并带有一个可选的正或负指数。如果数字包含小数点,则文字具有定点类型。
- 规则 标识符
Solidity 中的标识符必须以字母、美元符号或下划线开头,并且可以在第一个符号之后包含数字。
- 规则 yul-evm 内置函数
EVM Yul 方言中的内置函数。
- 规则 yul 标识符
Yul 标识符由字母、美元符号、下划线和数字组成,但不能以数字开头。在内联汇编中,用户定义的标识符中不能包含点。而是参见 yulPath,用于包含带点的标识符的表达式。
- 规则 yul 十六进制数字
Yul 中的十六进制文字由一个前缀和一个或多个十六进制数字组成。
- 规则 yul 十进制数字
Yul 中的十进制文字可以是零或任何不含前导零的十进制数字序列。
- 规则 yul 字符串文字
Yul 中的字符串文字由一个或多个双引号或单引号字符串组成,这些字符串可以包含转义序列和可打印字符,但不包含未转义的换行符或未转义的双引号或单引号。
- 规则 pragma 令牌
Pragma 令牌。可以包含任何类型的符号,但分号除外。请注意,目前 Solidity 解析器只允许此功能的子集。