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

王小兵  等:面向 MSVL 的智能合约形式化验证                                                        1855


                                     〈IDENTIFIER:〈LETTER〉(〈LETTER〉|〈DIGIT〉)*〉

                                     〈LETTER:[“A”−“Z”,“_”,“a”−“z”]〉
                                     〈DIGIT:[“0”−“9”]〉
                                     Fig.5    Regular expressions of identifiers
                                          图 5   标识符的正则表达式
             (3)  运算符与界限符
             运算符是语言固有的操作符号,Solidity 语言中的运算符见表 2.
                                             Table 2  Operators
                                                表 2   运算符
                           运算符         对应标记          运算符           对应标记
                            “+”         PLUS          “/”          DIVIDE
                            “−”         MINUS         “*”         MULTIPLY
                           “++”       SELFPLUS        “−−”       SELEFMINUS
                            “%”       REMAINDER       “>”          GREAT
                            “<”        LOWER          “>=”        GREATER
                           “==”         EQUAL         “!=”        UNEQUAL
                           “<=”        LOWERW         “!”           NOT
                           “&&”         AND           “||”           OR
                            “&”        BIT_ADD        “|”          BIT_OR
                            “^”        BIT_XOR        “~”          BIT_NOT
                            “=”      ASSIGNMENT       “+=”     PLUS_ASSIGNMENT
                           “−=”   MINUS_ASSIGNMENT    “*=”   MULTIPLY_ASSIGNMENT
                            “/=”  DIVIDE_ASSIGNMENT   “%=”  REMAINDER_ASSIGNMENT
                           “&=”  BIT_ADD_ASSIGNMENT   “|=”    BIT_OR_ASSIGNMENT
                           “^=”  BIT_XOR_ASSIGNMENT   “~=”   BIT_NOT_ASSIGNMENT

             界限符主要用于分割不同语句或标识符,Solidity 中的界限符见表 3.
                                         Table 3   Boundary characters
                                                表 3   界限符
                                      界限符     对应标记      界限符   对应标记
                                       “(”      LC       “) ”    RC
                                       “[”      LM       “]”    RM
                                       “{”      LB       “}”     RB
                                       “.”     SPOT      “:”   COLON
                                       “;”  SEMICOLON    “,”    DOT
             (4)  常量
             常量为不会发生改变的内容,如整型常量、布尔常量、地址常量和字符常量,这 4 类常量通常能满足大部
         分智能合约的要求,如果合约需要更复杂的常量,只需在 JavaCC 的常量定义部分进行扩充,常量的正则表达式
         如图 6 所示.
                                   INTEGER_LITERAL:〈HEX_LITERAL〉|〈CONSTANT〉

                                   〈HEX_LITERAL:“hex”([“0”−“9”,“a”−“f”,“A”−“F”])+〉

                                   〈CONSTANT:“0”|[“1”−“9”](〈DIGIT〉)*〉
                                   〈DIGIT:[“0”−“9”]〉
                                      Fig.6    Regular expressions of constants
                                           图 6   常量的正则表达式
         3.3   语法分析模块
             语法分析建立在词法分析的基础之上,对词法分析生成的单词序列按照语法规则组成有特定含义的语句,
         并生成与源代码等价的语法树.本文使用 BNF 范式描述智能合约的语法规则.
             首先,智能合约由结构体、状态变量、函数以及事件 4 部分组成,其 BNF 定义如图 7 所示.合约以 Start 为
         开始,以 Procedure 为终止.合约主体部分为 ContractBlock 声明,包含 Struct,Statedef 以及 Method,分别用于声明
   276   277   278   279   280   281   282   283   284   285   286