Page 282 - 《软件学报》2021年第6期
P. 282

1856                                     Journal of Software  软件学报 Vol.32, No.6,  June 2021

         结构体、状态变量与函数.

                     1   Start::=Procedure

                     2   Procedure::=〈CONTRACT〉〈IDENTIFIER〉〈LB〉(ContractBlock)*〈RB〉
                     3  ContractBlock::=Struct
                     4               |Statedef
                     5               |Method
                     6   Struct::=〈STRUCT〉〈IDENTIFIER〉〈LB〉(Type〈IDENTIFIER〉〈SEMICOLON〉)*〈RB〉
                    7  Type::=〈UINT〉(〈LM〉〈RM〉)?
                    8       |〈ADDRESS〉(〈LM〉〈RM〉)?
                    9       |〈BOOL〉(〈LM〉〈RM〉)?

                    10      |〈MAPPING〉〈LC〉Type“=>”Type〈RC〉(〈LM〉〈RM〉)?
                    11      |〈IDENTIFIER〉(〈LM〉〈RM〉)?
                    12 Statedef::=Type(Limit)?〈IDENTIFIER〉(〈ASSIGNMENT〉Expression)?〈SEMICOLON〉
                    13 Method::=〈FUNCTION〉〈IDENTIFIER〉〈LC〉(Typ  e〈IDENTIFIER〉(〈DOT〉Type〈IDENTIFIER〉)*)?
                    14          〈RC〉(Limit)?(FUNReturn)?〈LB〉(Statement)*〈RB〉
                    15 Limit::=〈PRIVATE〉
                    16      |〈PUBLIC〉
                    17      |〈INTERNAL〉

                    18 FUNReturn::=〈RETURNS〉〈LC〉Type(〈IDENTIFIER〉)?(〈DOT〉Type(〈IDENTIFIER〉)?)*〈RC〉
                                     Fig.7    BNF definitions of smart contracts
                                          图 7   智能合约的 BNF 定义

             其次,智能合约源程序由各种基本语句组成,主要包括声明语句、表达式语句、条件判断语句、循环语句、
         转向语句、复合语句(也称语句块)以及空语句,其 BNF 定义如图 8 所示.非终结符 Statement 表示基本语句,IF,
         While,For 分别定义了条件判断语句与循环语句,Block 定义了复合语句,Statedef 定义了声明语句,return 与 throw
         定义了两个跳转语句.
                          1   Statement::=IF
                          2           |While
                          3           |For
                          4           |Block
                          5           |〈RETURN〉(Expression)?〈SEMICOLON〉
                          6           |〈THROW〉〈SEMICOLON〉
                          7           |Expression〈SEMICOLON〉
                          8           |Statedef

                          9   IF::=〈IF〉〈LC〉Expression〈RC〉Statement(〈ELSE〉Statement)?
                          10 For::=〈FOR〉〈LC〉Statedef Expression〈SEMICOLON〉Expression〈RC〉Statement

                          11 While::=〈WHILE〉〈LC〉Expression〈RC〉Statement
                          12 Block::=〈LB〉(Statement)*〈RB〉
                                     Fig.8    BNF definitions of basic statements
                                          图 8   基本语句的 BNF 定义
             表达式结构包含了程序中的各类运算与操作,其 BNF 最为复杂,如图 9 所示.第 1 行中的 Literal 表示可能出
         现的字面值,包括变量、结构体、数组、整型变量和布尔变量等;第 2 行的 Unop 表示单目运算;第 3 行~第 8 行
         的 Binop 表示双目运算符:Assign 表示赋值运算符,PLUS_MINUS 表示自增自减运算符.除此之外,还定义了
         [⋅],(⋅),.操作,可以描述 Solidity 中成员函数的调用.
                                 1  Expression::=Literal Expression_left

                                 2            |Unop Expression Expression_left

                                 3  Expression_left::=Binop Expression Expression_left
                                 4                |Assign Expression Expression_left

                                 5                |“[”Expression“]”Expression_left
                                 6                |“(”(Expression“,”)*“)”Expression_left

                                 7                |“.”〈IDENTIFIER〉Expression_left

                                 8                 |PLUS MINUS Expression left
                                   Fig.9    BNF definitions of expression statements
                                         图 9   表达式语句的 BNF 定义
   277   278   279   280   281   282   283   284   285   286   287