Skip to content

Instantly share code, notes, and snippets.

@Ivlyth
Last active July 19, 2023 05:56
Show Gist options
  • Save Ivlyth/e052a0e4804364d7af33075ab014fe26 to your computer and use it in GitHub Desktop.
Save Ivlyth/e052a0e4804364d7af33075ab014fe26 to your computer and use it in GitHub Desktop.
golang ast
a()
     0  *expr.CallExpr {
     1  .  CallExpr: ast.CallExpr {
     2  .  .  Fun: *ast.Ident {
     3  .  .  .  NamePos: -
     4  .  .  .  Name: "a"
     5  .  .  }
     6  .  .  Lparen: -
     7  .  .  Ellipsis: -
     8  .  .  Rparen: -
     9  .  }
    10  }
     0  *ast.CallExpr {
     1  .  Fun: *ast.Ident {
     2  .  .  NamePos: -
     3  .  .  Name: "a"
     4  .  }
     5  .  Lparen: -
     6  .  Ellipsis: -
     7  .  Rparen: -
     8  }
!a()
     0  *expr.NotExpr {
     1  .  UnaryExpr: ast.UnaryExpr {
     2  .  .  OpPos: -
     3  .  .  Op: !
     4  .  .  X: *expr.CallExpr {
     5  .  .  .  CallExpr: ast.CallExpr {
     6  .  .  .  .  Fun: *ast.Ident {
     7  .  .  .  .  .  NamePos: -
     8  .  .  .  .  .  Name: "a"
     9  .  .  .  .  }
    10  .  .  .  .  Lparen: -
    11  .  .  .  .  Ellipsis: -
    12  .  .  .  .  Rparen: -
    13  .  .  .  }
    14  .  .  }
    15  .  }
    16  }
     0  *ast.UnaryExpr {
     1  .  OpPos: -
     2  .  Op: !
     3  .  X: *ast.CallExpr {
     4  .  .  Fun: *ast.Ident {
     5  .  .  .  NamePos: -
     6  .  .  .  Name: "a"
     7  .  .  }
     8  .  .  Lparen: -
     9  .  .  Ellipsis: -
    10  .  .  Rparen: -
    11  .  }
    12  }
a.range(c, d)
     0  *expr.CallExpr {
     1  .  CallExpr: ast.CallExpr {
     2  .  .  Fun: *ast.SelectorExpr {
     3  .  .  .  X: *ast.Ident {
     4  .  .  .  .  NamePos: -
     5  .  .  .  .  Name: "a"
     6  .  .  .  }
     7  .  .  .  Sel: *ast.Ident {
     8  .  .  .  .  NamePos: -
     9  .  .  .  .  Name: "rangee"
    10  .  .  .  }
    11  .  .  }
    12  .  .  Lparen: -
    13  .  .  Args: []ast.Expr (len = 2) {
    14  .  .  .  0: *ast.Ident {
    15  .  .  .  .  NamePos: -
    16  .  .  .  .  Name: "c"
    17  .  .  .  }
    18  .  .  .  1: *ast.Ident {
    19  .  .  .  .  NamePos: -
    20  .  .  .  .  Name: "d"
    21  .  .  .  }
    22  .  .  }
    23  .  .  Ellipsis: -
    24  .  .  Rparen: -
    25  .  }
    26  }
     0  *ast.CallExpr {
     1  .  Fun: *ast.SelectorExpr {
     2  .  .  X: *ast.Ident {
     3  .  .  .  NamePos: -
     4  .  .  .  Name: "a"
     5  .  .  }
     6  .  .  Sel: *ast.Ident {
     7  .  .  .  NamePos: -
     8  .  .  .  Name: "rangee"
     9  .  .  }
    10  .  }
    11  .  Lparen: -
    12  .  Args: []ast.Expr (len = 2) {
    13  .  .  0: *ast.Ident {
    14  .  .  .  NamePos: -
    15  .  .  .  Name: "c"
    16  .  .  }
    17  .  .  1: *ast.Ident {
    18  .  .  .  NamePos: -
    19  .  .  .  Name: "d"
    20  .  .  }
    21  .  }
    22  .  Ellipsis: -
    23  .  Rparen: -
    24  }
!a.range(c, d)
     0  *expr.NotExpr {
     1  .  UnaryExpr: ast.UnaryExpr {
     2  .  .  OpPos: -
     3  .  .  Op: !
     4  .  .  X: *expr.CallExpr {
     5  .  .  .  CallExpr: ast.CallExpr {
     6  .  .  .  .  Fun: *ast.SelectorExpr {
     7  .  .  .  .  .  X: *ast.Ident {
     8  .  .  .  .  .  .  NamePos: -
     9  .  .  .  .  .  .  Name: "a"
    10  .  .  .  .  .  }
    11  .  .  .  .  .  Sel: *ast.Ident {
    12  .  .  .  .  .  .  NamePos: -
    13  .  .  .  .  .  .  Name: "rangee"
    14  .  .  .  .  .  }
    15  .  .  .  .  }
    16  .  .  .  .  Lparen: -
    17  .  .  .  .  Args: []ast.Expr (len = 2) {
    18  .  .  .  .  .  0: *ast.Ident {
    19  .  .  .  .  .  .  NamePos: -
    20  .  .  .  .  .  .  Name: "c"
    21  .  .  .  .  .  }
    22  .  .  .  .  .  1: *ast.Ident {
    23  .  .  .  .  .  .  NamePos: -
    24  .  .  .  .  .  .  Name: "d"
    25  .  .  .  .  .  }
    26  .  .  .  .  }
    27  .  .  .  .  Ellipsis: -
    28  .  .  .  .  Rparen: -
    29  .  .  .  }
    30  .  .  }
    31  .  }
    32  }
     0  *ast.UnaryExpr {
     1  .  OpPos: -
     2  .  Op: !
     3  .  X: *ast.CallExpr {
     4  .  .  Fun: *ast.SelectorExpr {
     5  .  .  .  X: *ast.Ident {
     6  .  .  .  .  NamePos: -
     7  .  .  .  .  Name: "a"
     8  .  .  .  }
     9  .  .  .  Sel: *ast.Ident {
    10  .  .  .  .  NamePos: -
    11  .  .  .  .  Name: "rangee"
    12  .  .  .  }
    13  .  .  }
    14  .  .  Lparen: -
    15  .  .  Args: []ast.Expr (len = 2) {
    16  .  .  .  0: *ast.Ident {
    17  .  .  .  .  NamePos: -
    18  .  .  .  .  Name: "c"
    19  .  .  .  }
    20  .  .  .  1: *ast.Ident {
    21  .  .  .  .  NamePos: -
    22  .  .  .  .  Name: "d"
    23  .  .  .  }
    24  .  .  }
    25  .  .  Ellipsis: -
    26  .  .  Rparen: -
    27  .  }
    28  }
a(1,'2',3.1,"4",True)
     0  *expr.CallExpr {
     1  .  CallExpr: ast.CallExpr {
     2  .  .  Fun: *ast.Ident {
     3  .  .  .  NamePos: -
     4  .  .  .  Name: "a"
     5  .  .  }
     6  .  .  Lparen: -
     7  .  .  Args: []ast.Expr (len = 5) {
     8  .  .  .  0: *ast.BasicLit {
     9  .  .  .  .  ValuePos: -
    10  .  .  .  .  Kind: INT
    11  .  .  .  .  Value: "1"
    12  .  .  .  }
    13  .  .  .  1: *ast.BasicLit {
    14  .  .  .  .  ValuePos: -
    15  .  .  .  .  Kind: CHAR
    16  .  .  .  .  Value: "'2'"
    17  .  .  .  }
    18  .  .  .  2: *ast.BasicLit {
    19  .  .  .  .  ValuePos: -
    20  .  .  .  .  Kind: FLOAT
    21  .  .  .  .  Value: "3.1"
    22  .  .  .  }
    23  .  .  .  3: *ast.BasicLit {
    24  .  .  .  .  ValuePos: -
    25  .  .  .  .  Kind: STRING
    26  .  .  .  .  Value: "\"4\""
    27  .  .  .  }
    28  .  .  .  4: *ast.Ident {
    29  .  .  .  .  NamePos: -
    30  .  .  .  .  Name: "True"
    31  .  .  .  }
    32  .  .  }
    33  .  .  Ellipsis: -
    34  .  .  Rparen: -
    35  .  }
    36  }
     0  *ast.CallExpr {
     1  .  Fun: *ast.Ident {
     2  .  .  NamePos: -
     3  .  .  Name: "a"
     4  .  }
     5  .  Lparen: -
     6  .  Args: []ast.Expr (len = 5) {
     7  .  .  0: *ast.BasicLit {
     8  .  .  .  ValuePos: -
     9  .  .  .  Kind: INT
    10  .  .  .  Value: "1"
    11  .  .  }
    12  .  .  1: *ast.BasicLit {
    13  .  .  .  ValuePos: -
    14  .  .  .  Kind: CHAR
    15  .  .  .  Value: "'2'"
    16  .  .  }
    17  .  .  2: *ast.BasicLit {
    18  .  .  .  ValuePos: -
    19  .  .  .  Kind: FLOAT
    20  .  .  .  Value: "3.1"
    21  .  .  }
    22  .  .  3: *ast.BasicLit {
    23  .  .  .  ValuePos: -
    24  .  .  .  Kind: STRING
    25  .  .  .  Value: "\"4\""
    26  .  .  }
    27  .  .  4: *ast.Ident {
    28  .  .  .  NamePos: -
    29  .  .  .  Name: "True"
    30  .  .  }
    31  .  }
    32  .  Ellipsis: -
    33  .  Rparen: -
    34  }
a == 1 or b == 1 or (c.d.len() > 10 and c.e.ends("hehe"))
     0  *expr.LogicExpr {
     1  .  BinaryExpr: ast.BinaryExpr {
     2  .  .  X: *expr.LogicExpr {
     3  .  .  .  BinaryExpr: ast.BinaryExpr {
     4  .  .  .  .  X: *expr.BinaryExpr {
     5  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
     6  .  .  .  .  .  .  X: *ast.Ident {
     7  .  .  .  .  .  .  .  NamePos: -
     8  .  .  .  .  .  .  .  Name: "a"
     9  .  .  .  .  .  .  }
    10  .  .  .  .  .  .  OpPos: -
    11  .  .  .  .  .  .  Op: ==
    12  .  .  .  .  .  .  Y: *ast.BasicLit {
    13  .  .  .  .  .  .  .  ValuePos: -
    14  .  .  .  .  .  .  .  Kind: INT
    15  .  .  .  .  .  .  .  Value: "1"
    16  .  .  .  .  .  .  }
    17  .  .  .  .  .  }
    18  .  .  .  .  }
    19  .  .  .  .  OpPos: -
    20  .  .  .  .  Op: ||
    21  .  .  .  .  Y: *expr.BinaryExpr {
    22  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    23  .  .  .  .  .  .  X: *ast.Ident {
    24  .  .  .  .  .  .  .  NamePos: -
    25  .  .  .  .  .  .  .  Name: "b"
    26  .  .  .  .  .  .  }
    27  .  .  .  .  .  .  OpPos: -
    28  .  .  .  .  .  .  Op: ==
    29  .  .  .  .  .  .  Y: *ast.BasicLit {
    30  .  .  .  .  .  .  .  ValuePos: -
    31  .  .  .  .  .  .  .  Kind: INT
    32  .  .  .  .  .  .  .  Value: "1"
    33  .  .  .  .  .  .  }
    34  .  .  .  .  .  }
    35  .  .  .  .  }
    36  .  .  .  }
    37  .  .  }
    38  .  .  OpPos: -
    39  .  .  Op: ||
    40  .  .  Y: *expr.GroupExpr {
    41  .  .  .  ParenExpr: ast.ParenExpr {
    42  .  .  .  .  Lparen: -
    43  .  .  .  .  X: *expr.LogicExpr {
    44  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    45  .  .  .  .  .  .  X: *expr.BinaryExpr {
    46  .  .  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    47  .  .  .  .  .  .  .  .  X: *expr.CallExpr {
    48  .  .  .  .  .  .  .  .  .  CallExpr: ast.CallExpr {
    49  .  .  .  .  .  .  .  .  .  .  Fun: *ast.SelectorExpr {
    50  .  .  .  .  .  .  .  .  .  .  .  X: *ast.SelectorExpr {
    51  .  .  .  .  .  .  .  .  .  .  .  .  X: *ast.Ident {
    52  .  .  .  .  .  .  .  .  .  .  .  .  .  NamePos: -
    53  .  .  .  .  .  .  .  .  .  .  .  .  .  Name: "c"
    54  .  .  .  .  .  .  .  .  .  .  .  .  }
    55  .  .  .  .  .  .  .  .  .  .  .  .  Sel: *ast.Ident {
    56  .  .  .  .  .  .  .  .  .  .  .  .  .  NamePos: -
    57  .  .  .  .  .  .  .  .  .  .  .  .  .  Name: "d"
    58  .  .  .  .  .  .  .  .  .  .  .  .  }
    59  .  .  .  .  .  .  .  .  .  .  .  }
    60  .  .  .  .  .  .  .  .  .  .  .  Sel: *ast.Ident {
    61  .  .  .  .  .  .  .  .  .  .  .  .  NamePos: -
    62  .  .  .  .  .  .  .  .  .  .  .  .  Name: "len"
    63  .  .  .  .  .  .  .  .  .  .  .  }
    64  .  .  .  .  .  .  .  .  .  .  }
    65  .  .  .  .  .  .  .  .  .  .  Lparen: -
    66  .  .  .  .  .  .  .  .  .  .  Ellipsis: -
    67  .  .  .  .  .  .  .  .  .  .  Rparen: -
    68  .  .  .  .  .  .  .  .  .  }
    69  .  .  .  .  .  .  .  .  }
    70  .  .  .  .  .  .  .  .  OpPos: -
    71  .  .  .  .  .  .  .  .  Op: >
    72  .  .  .  .  .  .  .  .  Y: *ast.BasicLit {
    73  .  .  .  .  .  .  .  .  .  ValuePos: -
    74  .  .  .  .  .  .  .  .  .  Kind: INT
    75  .  .  .  .  .  .  .  .  .  Value: "10"
    76  .  .  .  .  .  .  .  .  }
    77  .  .  .  .  .  .  .  }
    78  .  .  .  .  .  .  }
    79  .  .  .  .  .  .  OpPos: -
    80  .  .  .  .  .  .  Op: &&
    81  .  .  .  .  .  .  Y: *expr.CallExpr {
    82  .  .  .  .  .  .  .  CallExpr: ast.CallExpr {
    83  .  .  .  .  .  .  .  .  Fun: *ast.SelectorExpr {
    84  .  .  .  .  .  .  .  .  .  X: *ast.SelectorExpr {
    85  .  .  .  .  .  .  .  .  .  .  X: *ast.Ident {
    86  .  .  .  .  .  .  .  .  .  .  .  NamePos: -
    87  .  .  .  .  .  .  .  .  .  .  .  Name: "c"
    88  .  .  .  .  .  .  .  .  .  .  }
    89  .  .  .  .  .  .  .  .  .  .  Sel: *ast.Ident {
    90  .  .  .  .  .  .  .  .  .  .  .  NamePos: -
    91  .  .  .  .  .  .  .  .  .  .  .  Name: "e"
    92  .  .  .  .  .  .  .  .  .  .  }
    93  .  .  .  .  .  .  .  .  .  }
    94  .  .  .  .  .  .  .  .  .  Sel: *ast.Ident {
    95  .  .  .  .  .  .  .  .  .  .  NamePos: -
    96  .  .  .  .  .  .  .  .  .  .  Name: "ends"
    97  .  .  .  .  .  .  .  .  .  }
    98  .  .  .  .  .  .  .  .  }
    99  .  .  .  .  .  .  .  .  Lparen: -
   100  .  .  .  .  .  .  .  .  Args: []ast.Expr (len = 1) {
   101  .  .  .  .  .  .  .  .  .  0: *ast.BasicLit {
   102  .  .  .  .  .  .  .  .  .  .  ValuePos: -
   103  .  .  .  .  .  .  .  .  .  .  Kind: STRING
   104  .  .  .  .  .  .  .  .  .  .  Value: "\"hehe\""
   105  .  .  .  .  .  .  .  .  .  }
   106  .  .  .  .  .  .  .  .  }
   107  .  .  .  .  .  .  .  .  Ellipsis: -
   108  .  .  .  .  .  .  .  .  Rparen: -
   109  .  .  .  .  .  .  .  }
   110  .  .  .  .  .  .  }
   111  .  .  .  .  .  }
   112  .  .  .  .  }
   113  .  .  .  .  Rparen: -
   114  .  .  .  }
   115  .  .  }
   116  .  }
   117  }
     0  *ast.BinaryExpr {
     1  .  X: *ast.BinaryExpr {
     2  .  .  X: *ast.BinaryExpr {
     3  .  .  .  X: *ast.Ident {
     4  .  .  .  .  NamePos: -
     5  .  .  .  .  Name: "a"
     6  .  .  .  }
     7  .  .  .  OpPos: -
     8  .  .  .  Op: ==
     9  .  .  .  Y: *ast.BasicLit {
    10  .  .  .  .  ValuePos: -
    11  .  .  .  .  Kind: INT
    12  .  .  .  .  Value: "1"
    13  .  .  .  }
    14  .  .  }
    15  .  .  OpPos: -
    16  .  .  Op: ||
    17  .  .  Y: *ast.BinaryExpr {
    18  .  .  .  X: *ast.Ident {
    19  .  .  .  .  NamePos: -
    20  .  .  .  .  Name: "b"
    21  .  .  .  }
    22  .  .  .  OpPos: -
    23  .  .  .  Op: ==
    24  .  .  .  Y: *ast.BasicLit {
    25  .  .  .  .  ValuePos: -
    26  .  .  .  .  Kind: INT
    27  .  .  .  .  Value: "1"
    28  .  .  .  }
    29  .  .  }
    30  .  }
    31  .  OpPos: -
    32  .  Op: ||
    33  .  Y: *ast.ParenExpr {
    34  .  .  Lparen: -
    35  .  .  X: *ast.BinaryExpr {
    36  .  .  .  X: *ast.BinaryExpr {
    37  .  .  .  .  X: *ast.CallExpr {
    38  .  .  .  .  .  Fun: *ast.SelectorExpr {
    39  .  .  .  .  .  .  X: *ast.SelectorExpr {
    40  .  .  .  .  .  .  .  X: *ast.Ident {
    41  .  .  .  .  .  .  .  .  NamePos: -
    42  .  .  .  .  .  .  .  .  Name: "c"
    43  .  .  .  .  .  .  .  }
    44  .  .  .  .  .  .  .  Sel: *ast.Ident {
    45  .  .  .  .  .  .  .  .  NamePos: -
    46  .  .  .  .  .  .  .  .  Name: "d"
    47  .  .  .  .  .  .  .  }
    48  .  .  .  .  .  .  }
    49  .  .  .  .  .  .  Sel: *ast.Ident {
    50  .  .  .  .  .  .  .  NamePos: -
    51  .  .  .  .  .  .  .  Name: "len"
    52  .  .  .  .  .  .  }
    53  .  .  .  .  .  }
    54  .  .  .  .  .  Lparen: -
    55  .  .  .  .  .  Ellipsis: -
    56  .  .  .  .  .  Rparen: -
    57  .  .  .  .  }
    58  .  .  .  .  OpPos: -
    59  .  .  .  .  Op: >
    60  .  .  .  .  Y: *ast.BasicLit {
    61  .  .  .  .  .  ValuePos: -
    62  .  .  .  .  .  Kind: INT
    63  .  .  .  .  .  Value: "10"
    64  .  .  .  .  }
    65  .  .  .  }
    66  .  .  .  OpPos: -
    67  .  .  .  Op: &&
    68  .  .  .  Y: *ast.CallExpr {
    69  .  .  .  .  Fun: *ast.SelectorExpr {
    70  .  .  .  .  .  X: *ast.SelectorExpr {
    71  .  .  .  .  .  .  X: *ast.Ident {
    72  .  .  .  .  .  .  .  NamePos: -
    73  .  .  .  .  .  .  .  Name: "c"
    74  .  .  .  .  .  .  }
    75  .  .  .  .  .  .  Sel: *ast.Ident {
    76  .  .  .  .  .  .  .  NamePos: -
    77  .  .  .  .  .  .  .  Name: "e"
    78  .  .  .  .  .  .  }
    79  .  .  .  .  .  }
    80  .  .  .  .  .  Sel: *ast.Ident {
    81  .  .  .  .  .  .  NamePos: -
    82  .  .  .  .  .  .  Name: "ends"
    83  .  .  .  .  .  }
    84  .  .  .  .  }
    85  .  .  .  .  Lparen: -
    86  .  .  .  .  Args: []ast.Expr (len = 1) {
    87  .  .  .  .  .  0: *ast.BasicLit {
    88  .  .  .  .  .  .  ValuePos: -
    89  .  .  .  .  .  .  Kind: STRING
    90  .  .  .  .  .  .  Value: "\"hehe\""
    91  .  .  .  .  .  }
    92  .  .  .  .  }
    93  .  .  .  .  Ellipsis: -
    94  .  .  .  .  Rparen: -
    95  .  .  .  }
    96  .  .  }
    97  .  .  Rparen: -
    98  .  }
    99  }
!(a == 1) or b == 1 or !(c.d.len() > 10 and c.e.ends("hehe"))
     0  *expr.LogicExpr {
     1  .  BinaryExpr: ast.BinaryExpr {
     2  .  .  X: *expr.LogicExpr {
     3  .  .  .  BinaryExpr: ast.BinaryExpr {
     4  .  .  .  .  X: *expr.NotExpr {
     5  .  .  .  .  .  UnaryExpr: ast.UnaryExpr {
     6  .  .  .  .  .  .  OpPos: -
     7  .  .  .  .  .  .  Op: !
     8  .  .  .  .  .  .  X: *expr.GroupExpr {
     9  .  .  .  .  .  .  .  ParenExpr: ast.ParenExpr {
    10  .  .  .  .  .  .  .  .  Lparen: -
    11  .  .  .  .  .  .  .  .  X: *expr.BinaryExpr {
    12  .  .  .  .  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    13  .  .  .  .  .  .  .  .  .  .  X: *ast.Ident {
    14  .  .  .  .  .  .  .  .  .  .  .  NamePos: -
    15  .  .  .  .  .  .  .  .  .  .  .  Name: "a"
    16  .  .  .  .  .  .  .  .  .  .  }
    17  .  .  .  .  .  .  .  .  .  .  OpPos: -
    18  .  .  .  .  .  .  .  .  .  .  Op: ==
    19  .  .  .  .  .  .  .  .  .  .  Y: *ast.BasicLit {
    20  .  .  .  .  .  .  .  .  .  .  .  ValuePos: -
    21  .  .  .  .  .  .  .  .  .  .  .  Kind: INT
    22  .  .  .  .  .  .  .  .  .  .  .  Value: "1"
    23  .  .  .  .  .  .  .  .  .  .  }
    24  .  .  .  .  .  .  .  .  .  }
    25  .  .  .  .  .  .  .  .  }
    26  .  .  .  .  .  .  .  .  Rparen: -
    27  .  .  .  .  .  .  .  }
    28  .  .  .  .  .  .  }
    29  .  .  .  .  .  }
    30  .  .  .  .  }
    31  .  .  .  .  OpPos: -
    32  .  .  .  .  Op: ||
    33  .  .  .  .  Y: *expr.BinaryExpr {
    34  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    35  .  .  .  .  .  .  X: *ast.Ident {
    36  .  .  .  .  .  .  .  NamePos: -
    37  .  .  .  .  .  .  .  Name: "b"
    38  .  .  .  .  .  .  }
    39  .  .  .  .  .  .  OpPos: -
    40  .  .  .  .  .  .  Op: ==
    41  .  .  .  .  .  .  Y: *ast.BasicLit {
    42  .  .  .  .  .  .  .  ValuePos: -
    43  .  .  .  .  .  .  .  Kind: INT
    44  .  .  .  .  .  .  .  Value: "1"
    45  .  .  .  .  .  .  }
    46  .  .  .  .  .  }
    47  .  .  .  .  }
    48  .  .  .  }
    49  .  .  }
    50  .  .  OpPos: -
    51  .  .  Op: ||
    52  .  .  Y: *expr.NotExpr {
    53  .  .  .  UnaryExpr: ast.UnaryExpr {
    54  .  .  .  .  OpPos: -
    55  .  .  .  .  Op: !
    56  .  .  .  .  X: *expr.GroupExpr {
    57  .  .  .  .  .  ParenExpr: ast.ParenExpr {
    58  .  .  .  .  .  .  Lparen: -
    59  .  .  .  .  .  .  X: *expr.LogicExpr {
    60  .  .  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    61  .  .  .  .  .  .  .  .  X: *expr.BinaryExpr {
    62  .  .  .  .  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    63  .  .  .  .  .  .  .  .  .  .  X: *expr.CallExpr {
    64  .  .  .  .  .  .  .  .  .  .  .  CallExpr: ast.CallExpr {
    65  .  .  .  .  .  .  .  .  .  .  .  .  Fun: *ast.SelectorExpr {
    66  .  .  .  .  .  .  .  .  .  .  .  .  .  X: *ast.SelectorExpr {
    67  .  .  .  .  .  .  .  .  .  .  .  .  .  .  X: *ast.Ident {
    68  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  NamePos: -
    69  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  Name: "c"
    70  .  .  .  .  .  .  .  .  .  .  .  .  .  .  }
    71  .  .  .  .  .  .  .  .  .  .  .  .  .  .  Sel: *ast.Ident {
    72  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  NamePos: -
    73  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  Name: "d"
    74  .  .  .  .  .  .  .  .  .  .  .  .  .  .  }
    75  .  .  .  .  .  .  .  .  .  .  .  .  .  }
    76  .  .  .  .  .  .  .  .  .  .  .  .  .  Sel: *ast.Ident {
    77  .  .  .  .  .  .  .  .  .  .  .  .  .  .  NamePos: -
    78  .  .  .  .  .  .  .  .  .  .  .  .  .  .  Name: "len"
    79  .  .  .  .  .  .  .  .  .  .  .  .  .  }
    80  .  .  .  .  .  .  .  .  .  .  .  .  }
    81  .  .  .  .  .  .  .  .  .  .  .  .  Lparen: -
    82  .  .  .  .  .  .  .  .  .  .  .  .  Ellipsis: -
    83  .  .  .  .  .  .  .  .  .  .  .  .  Rparen: -
    84  .  .  .  .  .  .  .  .  .  .  .  }
    85  .  .  .  .  .  .  .  .  .  .  }
    86  .  .  .  .  .  .  .  .  .  .  OpPos: -
    87  .  .  .  .  .  .  .  .  .  .  Op: >
    88  .  .  .  .  .  .  .  .  .  .  Y: *ast.BasicLit {
    89  .  .  .  .  .  .  .  .  .  .  .  ValuePos: -
    90  .  .  .  .  .  .  .  .  .  .  .  Kind: INT
    91  .  .  .  .  .  .  .  .  .  .  .  Value: "10"
    92  .  .  .  .  .  .  .  .  .  .  }
    93  .  .  .  .  .  .  .  .  .  }
    94  .  .  .  .  .  .  .  .  }
    95  .  .  .  .  .  .  .  .  OpPos: -
    96  .  .  .  .  .  .  .  .  Op: &&
    97  .  .  .  .  .  .  .  .  Y: *expr.CallExpr {
    98  .  .  .  .  .  .  .  .  .  CallExpr: ast.CallExpr {
    99  .  .  .  .  .  .  .  .  .  .  Fun: *ast.SelectorExpr {
   100  .  .  .  .  .  .  .  .  .  .  .  X: *ast.SelectorExpr {
   101  .  .  .  .  .  .  .  .  .  .  .  .  X: *ast.Ident {
   102  .  .  .  .  .  .  .  .  .  .  .  .  .  NamePos: -
   103  .  .  .  .  .  .  .  .  .  .  .  .  .  Name: "c"
   104  .  .  .  .  .  .  .  .  .  .  .  .  }
   105  .  .  .  .  .  .  .  .  .  .  .  .  Sel: *ast.Ident {
   106  .  .  .  .  .  .  .  .  .  .  .  .  .  NamePos: -
   107  .  .  .  .  .  .  .  .  .  .  .  .  .  Name: "e"
   108  .  .  .  .  .  .  .  .  .  .  .  .  }
   109  .  .  .  .  .  .  .  .  .  .  .  }
   110  .  .  .  .  .  .  .  .  .  .  .  Sel: *ast.Ident {
   111  .  .  .  .  .  .  .  .  .  .  .  .  NamePos: -
   112  .  .  .  .  .  .  .  .  .  .  .  .  Name: "ends"
   113  .  .  .  .  .  .  .  .  .  .  .  }
   114  .  .  .  .  .  .  .  .  .  .  }
   115  .  .  .  .  .  .  .  .  .  .  Lparen: -
   116  .  .  .  .  .  .  .  .  .  .  Args: []ast.Expr (len = 1) {
   117  .  .  .  .  .  .  .  .  .  .  .  0: *ast.BasicLit {
   118  .  .  .  .  .  .  .  .  .  .  .  .  ValuePos: -
   119  .  .  .  .  .  .  .  .  .  .  .  .  Kind: STRING
   120  .  .  .  .  .  .  .  .  .  .  .  .  Value: "\"hehe\""
   121  .  .  .  .  .  .  .  .  .  .  .  }
   122  .  .  .  .  .  .  .  .  .  .  }
   123  .  .  .  .  .  .  .  .  .  .  Ellipsis: -
   124  .  .  .  .  .  .  .  .  .  .  Rparen: -
   125  .  .  .  .  .  .  .  .  .  }
   126  .  .  .  .  .  .  .  .  }
   127  .  .  .  .  .  .  .  }
   128  .  .  .  .  .  .  }
   129  .  .  .  .  .  .  Rparen: -
   130  .  .  .  .  .  }
   131  .  .  .  .  }
   132  .  .  .  }
   133  .  .  }
   134  .  }
   135  }
     0  *ast.BinaryExpr {
     1  .  X: *ast.BinaryExpr {
     2  .  .  X: *ast.UnaryExpr {
     3  .  .  .  OpPos: -
     4  .  .  .  Op: !
     5  .  .  .  X: *ast.ParenExpr {
     6  .  .  .  .  Lparen: -
     7  .  .  .  .  X: *ast.BinaryExpr {
     8  .  .  .  .  .  X: *ast.Ident {
     9  .  .  .  .  .  .  NamePos: -
    10  .  .  .  .  .  .  Name: "a"
    11  .  .  .  .  .  }
    12  .  .  .  .  .  OpPos: -
    13  .  .  .  .  .  Op: ==
    14  .  .  .  .  .  Y: *ast.BasicLit {
    15  .  .  .  .  .  .  ValuePos: -
    16  .  .  .  .  .  .  Kind: INT
    17  .  .  .  .  .  .  Value: "1"
    18  .  .  .  .  .  }
    19  .  .  .  .  }
    20  .  .  .  .  Rparen: -
    21  .  .  .  }
    22  .  .  }
    23  .  .  OpPos: -
    24  .  .  Op: ||
    25  .  .  Y: *ast.BinaryExpr {
    26  .  .  .  X: *ast.Ident {
    27  .  .  .  .  NamePos: -
    28  .  .  .  .  Name: "b"
    29  .  .  .  }
    30  .  .  .  OpPos: -
    31  .  .  .  Op: ==
    32  .  .  .  Y: *ast.BasicLit {
    33  .  .  .  .  ValuePos: -
    34  .  .  .  .  Kind: INT
    35  .  .  .  .  Value: "1"
    36  .  .  .  }
    37  .  .  }
    38  .  }
    39  .  OpPos: -
    40  .  Op: ||
    41  .  Y: *ast.UnaryExpr {
    42  .  .  OpPos: -
    43  .  .  Op: !
    44  .  .  X: *ast.ParenExpr {
    45  .  .  .  Lparen: -
    46  .  .  .  X: *ast.BinaryExpr {
    47  .  .  .  .  X: *ast.BinaryExpr {
    48  .  .  .  .  .  X: *ast.CallExpr {
    49  .  .  .  .  .  .  Fun: *ast.SelectorExpr {
    50  .  .  .  .  .  .  .  X: *ast.SelectorExpr {
    51  .  .  .  .  .  .  .  .  X: *ast.Ident {
    52  .  .  .  .  .  .  .  .  .  NamePos: -
    53  .  .  .  .  .  .  .  .  .  Name: "c"
    54  .  .  .  .  .  .  .  .  }
    55  .  .  .  .  .  .  .  .  Sel: *ast.Ident {
    56  .  .  .  .  .  .  .  .  .  NamePos: -
    57  .  .  .  .  .  .  .  .  .  Name: "d"
    58  .  .  .  .  .  .  .  .  }
    59  .  .  .  .  .  .  .  }
    60  .  .  .  .  .  .  .  Sel: *ast.Ident {
    61  .  .  .  .  .  .  .  .  NamePos: -
    62  .  .  .  .  .  .  .  .  Name: "len"
    63  .  .  .  .  .  .  .  }
    64  .  .  .  .  .  .  }
    65  .  .  .  .  .  .  Lparen: -
    66  .  .  .  .  .  .  Ellipsis: -
    67  .  .  .  .  .  .  Rparen: -
    68  .  .  .  .  .  }
    69  .  .  .  .  .  OpPos: -
    70  .  .  .  .  .  Op: >
    71  .  .  .  .  .  Y: *ast.BasicLit {
    72  .  .  .  .  .  .  ValuePos: -
    73  .  .  .  .  .  .  Kind: INT
    74  .  .  .  .  .  .  Value: "10"
    75  .  .  .  .  .  }
    76  .  .  .  .  }
    77  .  .  .  .  OpPos: -
    78  .  .  .  .  Op: &&
    79  .  .  .  .  Y: *ast.CallExpr {
    80  .  .  .  .  .  Fun: *ast.SelectorExpr {
    81  .  .  .  .  .  .  X: *ast.SelectorExpr {
    82  .  .  .  .  .  .  .  X: *ast.Ident {
    83  .  .  .  .  .  .  .  .  NamePos: -
    84  .  .  .  .  .  .  .  .  Name: "c"
    85  .  .  .  .  .  .  .  }
    86  .  .  .  .  .  .  .  Sel: *ast.Ident {
    87  .  .  .  .  .  .  .  .  NamePos: -
    88  .  .  .  .  .  .  .  .  Name: "e"
    89  .  .  .  .  .  .  .  }
    90  .  .  .  .  .  .  }
    91  .  .  .  .  .  .  Sel: *ast.Ident {
    92  .  .  .  .  .  .  .  NamePos: -
    93  .  .  .  .  .  .  .  Name: "ends"
    94  .  .  .  .  .  .  }
    95  .  .  .  .  .  }
    96  .  .  .  .  .  Lparen: -
    97  .  .  .  .  .  Args: []ast.Expr (len = 1) {
    98  .  .  .  .  .  .  0: *ast.BasicLit {
    99  .  .  .  .  .  .  .  ValuePos: -
   100  .  .  .  .  .  .  .  Kind: STRING
   101  .  .  .  .  .  .  .  Value: "\"hehe\""
   102  .  .  .  .  .  .  }
   103  .  .  .  .  .  }
   104  .  .  .  .  .  Ellipsis: -
   105  .  .  .  .  .  Rparen: -
   106  .  .  .  .  }
   107  .  .  .  }
   108  .  .  .  Rparen: -
   109  .  .  }
   110  .  }
   111  }
!a == 1
     0  *expr.BinaryExpr {
     1  .  BinaryExpr: ast.BinaryExpr {
     2  .  .  X: *expr.NotExpr {
     3  .  .  .  UnaryExpr: ast.UnaryExpr {
     4  .  .  .  .  OpPos: -
     5  .  .  .  .  Op: !
     6  .  .  .  .  X: *ast.Ident {
     7  .  .  .  .  .  NamePos: -
     8  .  .  .  .  .  Name: "a"
     9  .  .  .  .  }
    10  .  .  .  }
    11  .  .  }
    12  .  .  OpPos: -
    13  .  .  Op: ==
    14  .  .  Y: *ast.BasicLit {
    15  .  .  .  ValuePos: -
    16  .  .  .  Kind: INT
    17  .  .  .  Value: "1"
    18  .  .  }
    19  .  }
    20  }
     0  *ast.BinaryExpr {
     1  .  X: *ast.UnaryExpr {
     2  .  .  OpPos: -
     3  .  .  Op: !
     4  .  .  X: *ast.Ident {
     5  .  .  .  NamePos: -
     6  .  .  .  Name: "a"
     7  .  .  }
     8  .  }
     9  .  OpPos: -
    10  .  Op: ==
    11  .  Y: *ast.BasicLit {
    12  .  .  ValuePos: -
    13  .  .  Kind: INT
    14  .  .  Value: "1"
    15  .  }
    16  }
a == b
     0  *expr.BinaryExpr {
     1  .  BinaryExpr: ast.BinaryExpr {
     2  .  .  X: *ast.Ident {
     3  .  .  .  NamePos: -
     4  .  .  .  Name: "a"
     5  .  .  }
     6  .  .  OpPos: -
     7  .  .  Op: ==
     8  .  .  Y: *ast.Ident {
     9  .  .  .  NamePos: -
    10  .  .  .  Name: "b"
    11  .  .  }
    12  .  }
    13  }
     0  *ast.BinaryExpr {
     1  .  X: *ast.Ident {
     2  .  .  NamePos: -
     3  .  .  Name: "a"
     4  .  }
     5  .  OpPos: -
     6  .  Op: ==
     7  .  Y: *ast.Ident {
     8  .  .  NamePos: -
     9  .  .  Name: "b"
    10  .  }
    11  }
a != b
     0  *expr.BinaryExpr {
     1  .  BinaryExpr: ast.BinaryExpr {
     2  .  .  X: *ast.Ident {
     3  .  .  .  NamePos: -
     4  .  .  .  Name: "a"
     5  .  .  }
     6  .  .  OpPos: -
     7  .  .  Op: !=
     8  .  .  Y: *ast.Ident {
     9  .  .  .  NamePos: -
    10  .  .  .  Name: "b"
    11  .  .  }
    12  .  }
    13  }
     0  *ast.BinaryExpr {
     1  .  X: *ast.Ident {
     2  .  .  NamePos: -
     3  .  .  Name: "a"
     4  .  }
     5  .  OpPos: -
     6  .  Op: !=
     7  .  Y: *ast.Ident {
     8  .  .  NamePos: -
     9  .  .  Name: "b"
    10  .  }
    11  }
a > b
     0  *expr.BinaryExpr {
     1  .  BinaryExpr: ast.BinaryExpr {
     2  .  .  X: *ast.Ident {
     3  .  .  .  NamePos: -
     4  .  .  .  Name: "a"
     5  .  .  }
     6  .  .  OpPos: -
     7  .  .  Op: >
     8  .  .  Y: *ast.Ident {
     9  .  .  .  NamePos: -
    10  .  .  .  Name: "b"
    11  .  .  }
    12  .  }
    13  }
     0  *ast.BinaryExpr {
     1  .  X: *ast.Ident {
     2  .  .  NamePos: -
     3  .  .  Name: "a"
     4  .  }
     5  .  OpPos: -
     6  .  Op: >
     7  .  Y: *ast.Ident {
     8  .  .  NamePos: -
     9  .  .  Name: "b"
    10  .  }
    11  }
^a == 1

error when parse ^a == 1: unsupported unary operator: ^

a >= b
     0  *expr.BinaryExpr {
     1  .  BinaryExpr: ast.BinaryExpr {
     2  .  .  X: *ast.Ident {
     3  .  .  .  NamePos: -
     4  .  .  .  Name: "a"
     5  .  .  }
     6  .  .  OpPos: -
     7  .  .  Op: >=
     8  .  .  Y: *ast.Ident {
     9  .  .  .  NamePos: -
    10  .  .  .  Name: "b"
    11  .  .  }
    12  .  }
    13  }
     0  *ast.BinaryExpr {
     1  .  X: *ast.Ident {
     2  .  .  NamePos: -
     3  .  .  Name: "a"
     4  .  }
     5  .  OpPos: -
     6  .  Op: >=
     7  .  Y: *ast.Ident {
     8  .  .  NamePos: -
     9  .  .  Name: "b"
    10  .  }
    11  }
a.b >= a.c
     0  *expr.BinaryExpr {
     1  .  BinaryExpr: ast.BinaryExpr {
     2  .  .  X: *ast.SelectorExpr {
     3  .  .  .  X: *ast.Ident {
     4  .  .  .  .  NamePos: -
     5  .  .  .  .  Name: "a"
     6  .  .  .  }
     7  .  .  .  Sel: *ast.Ident {
     8  .  .  .  .  NamePos: -
     9  .  .  .  .  Name: "b"
    10  .  .  .  }
    11  .  .  }
    12  .  .  OpPos: -
    13  .  .  Op: >=
    14  .  .  Y: *ast.SelectorExpr {
    15  .  .  .  X: *ast.Ident {
    16  .  .  .  .  NamePos: -
    17  .  .  .  .  Name: "a"
    18  .  .  .  }
    19  .  .  .  Sel: *ast.Ident {
    20  .  .  .  .  NamePos: -
    21  .  .  .  .  Name: "c"
    22  .  .  .  }
    23  .  .  }
    24  .  }
    25  }
     0  *ast.BinaryExpr {
     1  .  X: *ast.SelectorExpr {
     2  .  .  X: *ast.Ident {
     3  .  .  .  NamePos: -
     4  .  .  .  Name: "a"
     5  .  .  }
     6  .  .  Sel: *ast.Ident {
     7  .  .  .  NamePos: -
     8  .  .  .  Name: "b"
     9  .  .  }
    10  .  }
    11  .  OpPos: -
    12  .  Op: >=
    13  .  Y: *ast.SelectorExpr {
    14  .  .  X: *ast.Ident {
    15  .  .  .  NamePos: -
    16  .  .  .  Name: "a"
    17  .  .  }
    18  .  .  Sel: *ast.Ident {
    19  .  .  .  NamePos: -
    20  .  .  .  Name: "c"
    21  .  .  }
    22  .  }
    23  }
!a.c.contains(a.b)
     0  *expr.NotExpr {
     1  .  UnaryExpr: ast.UnaryExpr {
     2  .  .  OpPos: -
     3  .  .  Op: !
     4  .  .  X: *expr.CallExpr {
     5  .  .  .  CallExpr: ast.CallExpr {
     6  .  .  .  .  Fun: *ast.SelectorExpr {
     7  .  .  .  .  .  X: *ast.SelectorExpr {
     8  .  .  .  .  .  .  X: *ast.Ident {
     9  .  .  .  .  .  .  .  NamePos: -
    10  .  .  .  .  .  .  .  Name: "a"
    11  .  .  .  .  .  .  }
    12  .  .  .  .  .  .  Sel: *ast.Ident {
    13  .  .  .  .  .  .  .  NamePos: -
    14  .  .  .  .  .  .  .  Name: "c"
    15  .  .  .  .  .  .  }
    16  .  .  .  .  .  }
    17  .  .  .  .  .  Sel: *ast.Ident {
    18  .  .  .  .  .  .  NamePos: -
    19  .  .  .  .  .  .  Name: "contains"
    20  .  .  .  .  .  }
    21  .  .  .  .  }
    22  .  .  .  .  Lparen: -
    23  .  .  .  .  Args: []ast.Expr (len = 1) {
    24  .  .  .  .  .  0: *ast.SelectorExpr {
    25  .  .  .  .  .  .  X: *ast.Ident {
    26  .  .  .  .  .  .  .  NamePos: -
    27  .  .  .  .  .  .  .  Name: "a"
    28  .  .  .  .  .  .  }
    29  .  .  .  .  .  .  Sel: *ast.Ident {
    30  .  .  .  .  .  .  .  NamePos: -
    31  .  .  .  .  .  .  .  Name: "b"
    32  .  .  .  .  .  .  }
    33  .  .  .  .  .  }
    34  .  .  .  .  }
    35  .  .  .  .  Ellipsis: -
    36  .  .  .  .  Rparen: -
    37  .  .  .  }
    38  .  .  }
    39  .  }
    40  }
     0  *ast.UnaryExpr {
     1  .  OpPos: -
     2  .  Op: !
     3  .  X: *ast.CallExpr {
     4  .  .  Fun: *ast.SelectorExpr {
     5  .  .  .  X: *ast.SelectorExpr {
     6  .  .  .  .  X: *ast.Ident {
     7  .  .  .  .  .  NamePos: -
     8  .  .  .  .  .  Name: "a"
     9  .  .  .  .  }
    10  .  .  .  .  Sel: *ast.Ident {
    11  .  .  .  .  .  NamePos: -
    12  .  .  .  .  .  Name: "c"
    13  .  .  .  .  }
    14  .  .  .  }
    15  .  .  .  Sel: *ast.Ident {
    16  .  .  .  .  NamePos: -
    17  .  .  .  .  Name: "contains"
    18  .  .  .  }
    19  .  .  }
    20  .  .  Lparen: -
    21  .  .  Args: []ast.Expr (len = 1) {
    22  .  .  .  0: *ast.SelectorExpr {
    23  .  .  .  .  X: *ast.Ident {
    24  .  .  .  .  .  NamePos: -
    25  .  .  .  .  .  Name: "a"
    26  .  .  .  .  }
    27  .  .  .  .  Sel: *ast.Ident {
    28  .  .  .  .  .  NamePos: -
    29  .  .  .  .  .  Name: "b"
    30  .  .  .  .  }
    31  .  .  .  }
    32  .  .  }
    33  .  .  Ellipsis: -
    34  .  .  Rparen: -
    35  .  }
    36  }
a.c.contains(1)
     0  *expr.CallExpr {
     1  .  CallExpr: ast.CallExpr {
     2  .  .  Fun: *ast.SelectorExpr {
     3  .  .  .  X: *ast.SelectorExpr {
     4  .  .  .  .  X: *ast.Ident {
     5  .  .  .  .  .  NamePos: -
     6  .  .  .  .  .  Name: "a"
     7  .  .  .  .  }
     8  .  .  .  .  Sel: *ast.Ident {
     9  .  .  .  .  .  NamePos: -
    10  .  .  .  .  .  Name: "c"
    11  .  .  .  .  }
    12  .  .  .  }
    13  .  .  .  Sel: *ast.Ident {
    14  .  .  .  .  NamePos: -
    15  .  .  .  .  Name: "contains"
    16  .  .  .  }
    17  .  .  }
    18  .  .  Lparen: -
    19  .  .  Args: []ast.Expr (len = 1) {
    20  .  .  .  0: *ast.BasicLit {
    21  .  .  .  .  ValuePos: -
    22  .  .  .  .  Kind: INT
    23  .  .  .  .  Value: "1"
    24  .  .  .  }
    25  .  .  }
    26  .  .  Ellipsis: -
    27  .  .  Rparen: -
    28  .  }
    29  }
     0  *ast.CallExpr {
     1  .  Fun: *ast.SelectorExpr {
     2  .  .  X: *ast.SelectorExpr {
     3  .  .  .  X: *ast.Ident {
     4  .  .  .  .  NamePos: -
     5  .  .  .  .  Name: "a"
     6  .  .  .  }
     7  .  .  .  Sel: *ast.Ident {
     8  .  .  .  .  NamePos: -
     9  .  .  .  .  Name: "c"
    10  .  .  .  }
    11  .  .  }
    12  .  .  Sel: *ast.Ident {
    13  .  .  .  NamePos: -
    14  .  .  .  Name: "contains"
    15  .  .  }
    16  .  }
    17  .  Lparen: -
    18  .  Args: []ast.Expr (len = 1) {
    19  .  .  0: *ast.BasicLit {
    20  .  .  .  ValuePos: -
    21  .  .  .  Kind: INT
    22  .  .  .  Value: "1"
    23  .  .  }
    24  .  }
    25  .  Ellipsis: -
    26  .  Rparen: -
    27  }
a=="myth"
     0  *expr.BinaryExpr {
     1  .  BinaryExpr: ast.BinaryExpr {
     2  .  .  X: *ast.Ident {
     3  .  .  .  NamePos: -
     4  .  .  .  Name: "a"
     5  .  .  }
     6  .  .  OpPos: -
     7  .  .  Op: ==
     8  .  .  Y: *ast.BasicLit {
     9  .  .  .  ValuePos: -
    10  .  .  .  Kind: STRING
    11  .  .  .  Value: "\"myth\""
    12  .  .  }
    13  .  }
    14  }
     0  *ast.BinaryExpr {
     1  .  X: *ast.Ident {
     2  .  .  NamePos: -
     3  .  .  Name: "a"
     4  .  }
     5  .  OpPos: -
     6  .  Op: ==
     7  .  Y: *ast.BasicLit {
     8  .  .  ValuePos: -
     9  .  .  Kind: STRING
    10  .  .  Value: "\"myth\""
    11  .  }
    12  }
a.like(b)
     0  *expr.CallExpr {
     1  .  CallExpr: ast.CallExpr {
     2  .  .  Fun: *ast.SelectorExpr {
     3  .  .  .  X: *ast.Ident {
     4  .  .  .  .  NamePos: -
     5  .  .  .  .  Name: "a"
     6  .  .  .  }
     7  .  .  .  Sel: *ast.Ident {
     8  .  .  .  .  NamePos: -
     9  .  .  .  .  Name: "like"
    10  .  .  .  }
    11  .  .  }
    12  .  .  Lparen: -
    13  .  .  Args: []ast.Expr (len = 1) {
    14  .  .  .  0: *ast.Ident {
    15  .  .  .  .  NamePos: -
    16  .  .  .  .  Name: "b"
    17  .  .  .  }
    18  .  .  }
    19  .  .  Ellipsis: -
    20  .  .  Rparen: -
    21  .  }
    22  }
     0  *ast.CallExpr {
     1  .  Fun: *ast.SelectorExpr {
     2  .  .  X: *ast.Ident {
     3  .  .  .  NamePos: -
     4  .  .  .  Name: "a"
     5  .  .  }
     6  .  .  Sel: *ast.Ident {
     7  .  .  .  NamePos: -
     8  .  .  .  Name: "like"
     9  .  .  }
    10  .  }
    11  .  Lparen: -
    12  .  Args: []ast.Expr (len = 1) {
    13  .  .  0: *ast.Ident {
    14  .  .  .  NamePos: -
    15  .  .  .  Name: "b"
    16  .  .  }
    17  .  }
    18  .  Ellipsis: -
    19  .  Rparen: -
    20  }
~a.in(b)

error when parse a.in(b): 1:1: expected operand, found ''

a.range(c, d)
     0  *expr.CallExpr {
     1  .  CallExpr: ast.CallExpr {
     2  .  .  Fun: *ast.SelectorExpr {
     3  .  .  .  X: *ast.Ident {
     4  .  .  .  .  NamePos: -
     5  .  .  .  .  Name: "a"
     6  .  .  .  }
     7  .  .  .  Sel: *ast.Ident {
     8  .  .  .  .  NamePos: -
     9  .  .  .  .  Name: "rangee"
    10  .  .  .  }
    11  .  .  }
    12  .  .  Lparen: -
    13  .  .  Args: []ast.Expr (len = 2) {
    14  .  .  .  0: *ast.Ident {
    15  .  .  .  .  NamePos: -
    16  .  .  .  .  Name: "c"
    17  .  .  .  }
    18  .  .  .  1: *ast.Ident {
    19  .  .  .  .  NamePos: -
    20  .  .  .  .  Name: "d"
    21  .  .  .  }
    22  .  .  }
    23  .  .  Ellipsis: -
    24  .  .  Rparen: -
    25  .  }
    26  }
     0  *ast.CallExpr {
     1  .  Fun: *ast.SelectorExpr {
     2  .  .  X: *ast.Ident {
     3  .  .  .  NamePos: -
     4  .  .  .  Name: "a"
     5  .  .  }
     6  .  .  Sel: *ast.Ident {
     7  .  .  .  NamePos: -
     8  .  .  .  Name: "rangee"
     9  .  .  }
    10  .  }
    11  .  Lparen: -
    12  .  Args: []ast.Expr (len = 2) {
    13  .  .  0: *ast.Ident {
    14  .  .  .  NamePos: -
    15  .  .  .  Name: "c"
    16  .  .  }
    17  .  .  1: *ast.Ident {
    18  .  .  .  NamePos: -
    19  .  .  .  Name: "d"
    20  .  .  }
    21  .  }
    22  .  Ellipsis: -
    23  .  Rparen: -
    24  }
a.like("what")
     0  *expr.CallExpr {
     1  .  CallExpr: ast.CallExpr {
     2  .  .  Fun: *ast.SelectorExpr {
     3  .  .  .  X: *ast.Ident {
     4  .  .  .  .  NamePos: -
     5  .  .  .  .  Name: "a"
     6  .  .  .  }
     7  .  .  .  Sel: *ast.Ident {
     8  .  .  .  .  NamePos: -
     9  .  .  .  .  Name: "like"
    10  .  .  .  }
    11  .  .  }
    12  .  .  Lparen: -
    13  .  .  Args: []ast.Expr (len = 1) {
    14  .  .  .  0: *ast.BasicLit {
    15  .  .  .  .  ValuePos: -
    16  .  .  .  .  Kind: STRING
    17  .  .  .  .  Value: "\"what\""
    18  .  .  .  }
    19  .  .  }
    20  .  .  Ellipsis: -
    21  .  .  Rparen: -
    22  .  }
    23  }
     0  *ast.CallExpr {
     1  .  Fun: *ast.SelectorExpr {
     2  .  .  X: *ast.Ident {
     3  .  .  .  NamePos: -
     4  .  .  .  Name: "a"
     5  .  .  }
     6  .  .  Sel: *ast.Ident {
     7  .  .  .  NamePos: -
     8  .  .  .  Name: "like"
     9  .  .  }
    10  .  }
    11  .  Lparen: -
    12  .  Args: []ast.Expr (len = 1) {
    13  .  .  0: *ast.BasicLit {
    14  .  .  .  ValuePos: -
    15  .  .  .  Kind: STRING
    16  .  .  .  Value: "\"what\""
    17  .  .  }
    18  .  }
    19  .  Ellipsis: -
    20  .  Rparen: -
    21  }
a.starts("prefix")
     0  *expr.CallExpr {
     1  .  CallExpr: ast.CallExpr {
     2  .  .  Fun: *ast.SelectorExpr {
     3  .  .  .  X: *ast.Ident {
     4  .  .  .  .  NamePos: -
     5  .  .  .  .  Name: "a"
     6  .  .  .  }
     7  .  .  .  Sel: *ast.Ident {
     8  .  .  .  .  NamePos: -
     9  .  .  .  .  Name: "starts"
    10  .  .  .  }
    11  .  .  }
    12  .  .  Lparen: -
    13  .  .  Args: []ast.Expr (len = 1) {
    14  .  .  .  0: *ast.BasicLit {
    15  .  .  .  .  ValuePos: -
    16  .  .  .  .  Kind: STRING
    17  .  .  .  .  Value: "\"prefix\""
    18  .  .  .  }
    19  .  .  }
    20  .  .  Ellipsis: -
    21  .  .  Rparen: -
    22  .  }
    23  }
     0  *ast.CallExpr {
     1  .  Fun: *ast.SelectorExpr {
     2  .  .  X: *ast.Ident {
     3  .  .  .  NamePos: -
     4  .  .  .  Name: "a"
     5  .  .  }
     6  .  .  Sel: *ast.Ident {
     7  .  .  .  NamePos: -
     8  .  .  .  Name: "starts"
     9  .  .  }
    10  .  }
    11  .  Lparen: -
    12  .  Args: []ast.Expr (len = 1) {
    13  .  .  0: *ast.BasicLit {
    14  .  .  .  ValuePos: -
    15  .  .  .  Kind: STRING
    16  .  .  .  Value: "\"prefix\""
    17  .  .  }
    18  .  }
    19  .  Ellipsis: -
    20  .  Rparen: -
    21  }
a >= 1 && b >= 10
     0  *expr.LogicExpr {
     1  .  BinaryExpr: ast.BinaryExpr {
     2  .  .  X: *expr.BinaryExpr {
     3  .  .  .  BinaryExpr: ast.BinaryExpr {
     4  .  .  .  .  X: *ast.Ident {
     5  .  .  .  .  .  NamePos: -
     6  .  .  .  .  .  Name: "a"
     7  .  .  .  .  }
     8  .  .  .  .  OpPos: -
     9  .  .  .  .  Op: >=
    10  .  .  .  .  Y: *ast.BasicLit {
    11  .  .  .  .  .  ValuePos: -
    12  .  .  .  .  .  Kind: INT
    13  .  .  .  .  .  Value: "1"
    14  .  .  .  .  }
    15  .  .  .  }
    16  .  .  }
    17  .  .  OpPos: -
    18  .  .  Op: &&
    19  .  .  Y: *expr.BinaryExpr {
    20  .  .  .  BinaryExpr: ast.BinaryExpr {
    21  .  .  .  .  X: *ast.Ident {
    22  .  .  .  .  .  NamePos: -
    23  .  .  .  .  .  Name: "b"
    24  .  .  .  .  }
    25  .  .  .  .  OpPos: -
    26  .  .  .  .  Op: >=
    27  .  .  .  .  Y: *ast.BasicLit {
    28  .  .  .  .  .  ValuePos: -
    29  .  .  .  .  .  Kind: INT
    30  .  .  .  .  .  Value: "10"
    31  .  .  .  .  }
    32  .  .  .  }
    33  .  .  }
    34  .  }
    35  }
     0  *ast.BinaryExpr {
     1  .  X: *ast.BinaryExpr {
     2  .  .  X: *ast.Ident {
     3  .  .  .  NamePos: -
     4  .  .  .  Name: "a"
     5  .  .  }
     6  .  .  OpPos: -
     7  .  .  Op: >=
     8  .  .  Y: *ast.BasicLit {
     9  .  .  .  ValuePos: -
    10  .  .  .  Kind: INT
    11  .  .  .  Value: "1"
    12  .  .  }
    13  .  }
    14  .  OpPos: -
    15  .  Op: &&
    16  .  Y: *ast.BinaryExpr {
    17  .  .  X: *ast.Ident {
    18  .  .  .  NamePos: -
    19  .  .  .  Name: "b"
    20  .  .  }
    21  .  .  OpPos: -
    22  .  .  Op: >=
    23  .  .  Y: *ast.BasicLit {
    24  .  .  .  ValuePos: -
    25  .  .  .  Kind: INT
    26  .  .  .  Value: "10"
    27  .  .  }
    28  .  }
    29  }
a == "a" && !(b == 1 || what == 1)
     0  *expr.LogicExpr {
     1  .  BinaryExpr: ast.BinaryExpr {
     2  .  .  X: *expr.BinaryExpr {
     3  .  .  .  BinaryExpr: ast.BinaryExpr {
     4  .  .  .  .  X: *ast.Ident {
     5  .  .  .  .  .  NamePos: -
     6  .  .  .  .  .  Name: "a"
     7  .  .  .  .  }
     8  .  .  .  .  OpPos: -
     9  .  .  .  .  Op: ==
    10  .  .  .  .  Y: *ast.BasicLit {
    11  .  .  .  .  .  ValuePos: -
    12  .  .  .  .  .  Kind: STRING
    13  .  .  .  .  .  Value: "\"a\""
    14  .  .  .  .  }
    15  .  .  .  }
    16  .  .  }
    17  .  .  OpPos: -
    18  .  .  Op: &&
    19  .  .  Y: *expr.NotExpr {
    20  .  .  .  UnaryExpr: ast.UnaryExpr {
    21  .  .  .  .  OpPos: -
    22  .  .  .  .  Op: !
    23  .  .  .  .  X: *expr.GroupExpr {
    24  .  .  .  .  .  ParenExpr: ast.ParenExpr {
    25  .  .  .  .  .  .  Lparen: -
    26  .  .  .  .  .  .  X: *expr.LogicExpr {
    27  .  .  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    28  .  .  .  .  .  .  .  .  X: *expr.BinaryExpr {
    29  .  .  .  .  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    30  .  .  .  .  .  .  .  .  .  .  X: *ast.Ident {
    31  .  .  .  .  .  .  .  .  .  .  .  NamePos: -
    32  .  .  .  .  .  .  .  .  .  .  .  Name: "b"
    33  .  .  .  .  .  .  .  .  .  .  }
    34  .  .  .  .  .  .  .  .  .  .  OpPos: -
    35  .  .  .  .  .  .  .  .  .  .  Op: ==
    36  .  .  .  .  .  .  .  .  .  .  Y: *ast.BasicLit {
    37  .  .  .  .  .  .  .  .  .  .  .  ValuePos: -
    38  .  .  .  .  .  .  .  .  .  .  .  Kind: INT
    39  .  .  .  .  .  .  .  .  .  .  .  Value: "1"
    40  .  .  .  .  .  .  .  .  .  .  }
    41  .  .  .  .  .  .  .  .  .  }
    42  .  .  .  .  .  .  .  .  }
    43  .  .  .  .  .  .  .  .  OpPos: -
    44  .  .  .  .  .  .  .  .  Op: ||
    45  .  .  .  .  .  .  .  .  Y: *expr.BinaryExpr {
    46  .  .  .  .  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    47  .  .  .  .  .  .  .  .  .  .  X: *ast.Ident {
    48  .  .  .  .  .  .  .  .  .  .  .  NamePos: -
    49  .  .  .  .  .  .  .  .  .  .  .  Name: "what"
    50  .  .  .  .  .  .  .  .  .  .  }
    51  .  .  .  .  .  .  .  .  .  .  OpPos: -
    52  .  .  .  .  .  .  .  .  .  .  Op: ==
    53  .  .  .  .  .  .  .  .  .  .  Y: *ast.BasicLit {
    54  .  .  .  .  .  .  .  .  .  .  .  ValuePos: -
    55  .  .  .  .  .  .  .  .  .  .  .  Kind: INT
    56  .  .  .  .  .  .  .  .  .  .  .  Value: "1"
    57  .  .  .  .  .  .  .  .  .  .  }
    58  .  .  .  .  .  .  .  .  .  }
    59  .  .  .  .  .  .  .  .  }
    60  .  .  .  .  .  .  .  }
    61  .  .  .  .  .  .  }
    62  .  .  .  .  .  .  Rparen: -
    63  .  .  .  .  .  }
    64  .  .  .  .  }
    65  .  .  .  }
    66  .  .  }
    67  .  }
    68  }
     0  *ast.BinaryExpr {
     1  .  X: *ast.BinaryExpr {
     2  .  .  X: *ast.Ident {
     3  .  .  .  NamePos: -
     4  .  .  .  Name: "a"
     5  .  .  }
     6  .  .  OpPos: -
     7  .  .  Op: ==
     8  .  .  Y: *ast.BasicLit {
     9  .  .  .  ValuePos: -
    10  .  .  .  Kind: STRING
    11  .  .  .  Value: "\"a\""
    12  .  .  }
    13  .  }
    14  .  OpPos: -
    15  .  Op: &&
    16  .  Y: *ast.UnaryExpr {
    17  .  .  OpPos: -
    18  .  .  Op: !
    19  .  .  X: *ast.ParenExpr {
    20  .  .  .  Lparen: -
    21  .  .  .  X: *ast.BinaryExpr {
    22  .  .  .  .  X: *ast.BinaryExpr {
    23  .  .  .  .  .  X: *ast.Ident {
    24  .  .  .  .  .  .  NamePos: -
    25  .  .  .  .  .  .  Name: "b"
    26  .  .  .  .  .  }
    27  .  .  .  .  .  OpPos: -
    28  .  .  .  .  .  Op: ==
    29  .  .  .  .  .  Y: *ast.BasicLit {
    30  .  .  .  .  .  .  ValuePos: -
    31  .  .  .  .  .  .  Kind: INT
    32  .  .  .  .  .  .  Value: "1"
    33  .  .  .  .  .  }
    34  .  .  .  .  }
    35  .  .  .  .  OpPos: -
    36  .  .  .  .  Op: ||
    37  .  .  .  .  Y: *ast.BinaryExpr {
    38  .  .  .  .  .  X: *ast.Ident {
    39  .  .  .  .  .  .  NamePos: -
    40  .  .  .  .  .  .  Name: "what"
    41  .  .  .  .  .  }
    42  .  .  .  .  .  OpPos: -
    43  .  .  .  .  .  Op: ==
    44  .  .  .  .  .  Y: *ast.BasicLit {
    45  .  .  .  .  .  .  ValuePos: -
    46  .  .  .  .  .  .  Kind: INT
    47  .  .  .  .  .  .  Value: "1"
    48  .  .  .  .  .  }
    49  .  .  .  .  }
    50  .  .  .  }
    51  .  .  .  Rparen: -
    52  .  .  }
    53  .  }
    54  }
(b == 1 || (!what == 1)) || a.starts("aaa")
     0  *expr.LogicExpr {
     1  .  BinaryExpr: ast.BinaryExpr {
     2  .  .  X: *expr.GroupExpr {
     3  .  .  .  ParenExpr: ast.ParenExpr {
     4  .  .  .  .  Lparen: -
     5  .  .  .  .  X: *expr.LogicExpr {
     6  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
     7  .  .  .  .  .  .  X: *expr.BinaryExpr {
     8  .  .  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
     9  .  .  .  .  .  .  .  .  X: *ast.Ident {
    10  .  .  .  .  .  .  .  .  .  NamePos: -
    11  .  .  .  .  .  .  .  .  .  Name: "b"
    12  .  .  .  .  .  .  .  .  }
    13  .  .  .  .  .  .  .  .  OpPos: -
    14  .  .  .  .  .  .  .  .  Op: ==
    15  .  .  .  .  .  .  .  .  Y: *ast.BasicLit {
    16  .  .  .  .  .  .  .  .  .  ValuePos: -
    17  .  .  .  .  .  .  .  .  .  Kind: INT
    18  .  .  .  .  .  .  .  .  .  Value: "1"
    19  .  .  .  .  .  .  .  .  }
    20  .  .  .  .  .  .  .  }
    21  .  .  .  .  .  .  }
    22  .  .  .  .  .  .  OpPos: -
    23  .  .  .  .  .  .  Op: ||
    24  .  .  .  .  .  .  Y: *expr.GroupExpr {
    25  .  .  .  .  .  .  .  ParenExpr: ast.ParenExpr {
    26  .  .  .  .  .  .  .  .  Lparen: -
    27  .  .  .  .  .  .  .  .  X: *expr.BinaryExpr {
    28  .  .  .  .  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    29  .  .  .  .  .  .  .  .  .  .  X: *expr.NotExpr {
    30  .  .  .  .  .  .  .  .  .  .  .  UnaryExpr: ast.UnaryExpr {
    31  .  .  .  .  .  .  .  .  .  .  .  .  OpPos: -
    32  .  .  .  .  .  .  .  .  .  .  .  .  Op: !
    33  .  .  .  .  .  .  .  .  .  .  .  .  X: *ast.Ident {
    34  .  .  .  .  .  .  .  .  .  .  .  .  .  NamePos: -
    35  .  .  .  .  .  .  .  .  .  .  .  .  .  Name: "what"
    36  .  .  .  .  .  .  .  .  .  .  .  .  }
    37  .  .  .  .  .  .  .  .  .  .  .  }
    38  .  .  .  .  .  .  .  .  .  .  }
    39  .  .  .  .  .  .  .  .  .  .  OpPos: -
    40  .  .  .  .  .  .  .  .  .  .  Op: ==
    41  .  .  .  .  .  .  .  .  .  .  Y: *ast.BasicLit {
    42  .  .  .  .  .  .  .  .  .  .  .  ValuePos: -
    43  .  .  .  .  .  .  .  .  .  .  .  Kind: INT
    44  .  .  .  .  .  .  .  .  .  .  .  Value: "1"
    45  .  .  .  .  .  .  .  .  .  .  }
    46  .  .  .  .  .  .  .  .  .  }
    47  .  .  .  .  .  .  .  .  }
    48  .  .  .  .  .  .  .  .  Rparen: -
    49  .  .  .  .  .  .  .  }
    50  .  .  .  .  .  .  }
    51  .  .  .  .  .  }
    52  .  .  .  .  }
    53  .  .  .  .  Rparen: -
    54  .  .  .  }
    55  .  .  }
    56  .  .  OpPos: -
    57  .  .  Op: ||
    58  .  .  Y: *expr.CallExpr {
    59  .  .  .  CallExpr: ast.CallExpr {
    60  .  .  .  .  Fun: *ast.SelectorExpr {
    61  .  .  .  .  .  X: *ast.Ident {
    62  .  .  .  .  .  .  NamePos: -
    63  .  .  .  .  .  .  Name: "a"
    64  .  .  .  .  .  }
    65  .  .  .  .  .  Sel: *ast.Ident {
    66  .  .  .  .  .  .  NamePos: -
    67  .  .  .  .  .  .  Name: "starts"
    68  .  .  .  .  .  }
    69  .  .  .  .  }
    70  .  .  .  .  Lparen: -
    71  .  .  .  .  Args: []ast.Expr (len = 1) {
    72  .  .  .  .  .  0: *ast.BasicLit {
    73  .  .  .  .  .  .  ValuePos: -
    74  .  .  .  .  .  .  Kind: STRING
    75  .  .  .  .  .  .  Value: "\"aaa\""
    76  .  .  .  .  .  }
    77  .  .  .  .  }
    78  .  .  .  .  Ellipsis: -
    79  .  .  .  .  Rparen: -
    80  .  .  .  }
    81  .  .  }
    82  .  }
    83  }
     0  *ast.BinaryExpr {
     1  .  X: *ast.ParenExpr {
     2  .  .  Lparen: -
     3  .  .  X: *ast.BinaryExpr {
     4  .  .  .  X: *ast.BinaryExpr {
     5  .  .  .  .  X: *ast.Ident {
     6  .  .  .  .  .  NamePos: -
     7  .  .  .  .  .  Name: "b"
     8  .  .  .  .  }
     9  .  .  .  .  OpPos: -
    10  .  .  .  .  Op: ==
    11  .  .  .  .  Y: *ast.BasicLit {
    12  .  .  .  .  .  ValuePos: -
    13  .  .  .  .  .  Kind: INT
    14  .  .  .  .  .  Value: "1"
    15  .  .  .  .  }
    16  .  .  .  }
    17  .  .  .  OpPos: -
    18  .  .  .  Op: ||
    19  .  .  .  Y: *ast.ParenExpr {
    20  .  .  .  .  Lparen: -
    21  .  .  .  .  X: *ast.BinaryExpr {
    22  .  .  .  .  .  X: *ast.UnaryExpr {
    23  .  .  .  .  .  .  OpPos: -
    24  .  .  .  .  .  .  Op: !
    25  .  .  .  .  .  .  X: *ast.Ident {
    26  .  .  .  .  .  .  .  NamePos: -
    27  .  .  .  .  .  .  .  Name: "what"
    28  .  .  .  .  .  .  }
    29  .  .  .  .  .  }
    30  .  .  .  .  .  OpPos: -
    31  .  .  .  .  .  Op: ==
    32  .  .  .  .  .  Y: *ast.BasicLit {
    33  .  .  .  .  .  .  ValuePos: -
    34  .  .  .  .  .  .  Kind: INT
    35  .  .  .  .  .  .  Value: "1"
    36  .  .  .  .  .  }
    37  .  .  .  .  }
    38  .  .  .  .  Rparen: -
    39  .  .  .  }
    40  .  .  }
    41  .  .  Rparen: -
    42  .  }
    43  .  OpPos: -
    44  .  Op: ||
    45  .  Y: *ast.CallExpr {
    46  .  .  Fun: *ast.SelectorExpr {
    47  .  .  .  X: *ast.Ident {
    48  .  .  .  .  NamePos: -
    49  .  .  .  .  Name: "a"
    50  .  .  .  }
    51  .  .  .  Sel: *ast.Ident {
    52  .  .  .  .  NamePos: -
    53  .  .  .  .  Name: "starts"
    54  .  .  .  }
    55  .  .  }
    56  .  .  Lparen: -
    57  .  .  Args: []ast.Expr (len = 1) {
    58  .  .  .  0: *ast.BasicLit {
    59  .  .  .  .  ValuePos: -
    60  .  .  .  .  Kind: STRING
    61  .  .  .  .  Value: "\"aaa\""
    62  .  .  .  }
    63  .  .  }
    64  .  .  Ellipsis: -
    65  .  .  Rparen: -
    66  .  }
    67  }
!(b == 1 || what == 1)
     0  *expr.NotExpr {
     1  .  UnaryExpr: ast.UnaryExpr {
     2  .  .  OpPos: -
     3  .  .  Op: !
     4  .  .  X: *expr.GroupExpr {
     5  .  .  .  ParenExpr: ast.ParenExpr {
     6  .  .  .  .  Lparen: -
     7  .  .  .  .  X: *expr.LogicExpr {
     8  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
     9  .  .  .  .  .  .  X: *expr.BinaryExpr {
    10  .  .  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    11  .  .  .  .  .  .  .  .  X: *ast.Ident {
    12  .  .  .  .  .  .  .  .  .  NamePos: -
    13  .  .  .  .  .  .  .  .  .  Name: "b"
    14  .  .  .  .  .  .  .  .  }
    15  .  .  .  .  .  .  .  .  OpPos: -
    16  .  .  .  .  .  .  .  .  Op: ==
    17  .  .  .  .  .  .  .  .  Y: *ast.BasicLit {
    18  .  .  .  .  .  .  .  .  .  ValuePos: -
    19  .  .  .  .  .  .  .  .  .  Kind: INT
    20  .  .  .  .  .  .  .  .  .  Value: "1"
    21  .  .  .  .  .  .  .  .  }
    22  .  .  .  .  .  .  .  }
    23  .  .  .  .  .  .  }
    24  .  .  .  .  .  .  OpPos: -
    25  .  .  .  .  .  .  Op: ||
    26  .  .  .  .  .  .  Y: *expr.BinaryExpr {
    27  .  .  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    28  .  .  .  .  .  .  .  .  X: *ast.Ident {
    29  .  .  .  .  .  .  .  .  .  NamePos: -
    30  .  .  .  .  .  .  .  .  .  Name: "what"
    31  .  .  .  .  .  .  .  .  }
    32  .  .  .  .  .  .  .  .  OpPos: -
    33  .  .  .  .  .  .  .  .  Op: ==
    34  .  .  .  .  .  .  .  .  Y: *ast.BasicLit {
    35  .  .  .  .  .  .  .  .  .  ValuePos: -
    36  .  .  .  .  .  .  .  .  .  Kind: INT
    37  .  .  .  .  .  .  .  .  .  Value: "1"
    38  .  .  .  .  .  .  .  .  }
    39  .  .  .  .  .  .  .  }
    40  .  .  .  .  .  .  }
    41  .  .  .  .  .  }
    42  .  .  .  .  }
    43  .  .  .  .  Rparen: -
    44  .  .  .  }
    45  .  .  }
    46  .  }
    47  }
     0  *ast.UnaryExpr {
     1  .  OpPos: -
     2  .  Op: !
     3  .  X: *ast.ParenExpr {
     4  .  .  Lparen: -
     5  .  .  X: *ast.BinaryExpr {
     6  .  .  .  X: *ast.BinaryExpr {
     7  .  .  .  .  X: *ast.Ident {
     8  .  .  .  .  .  NamePos: -
     9  .  .  .  .  .  Name: "b"
    10  .  .  .  .  }
    11  .  .  .  .  OpPos: -
    12  .  .  .  .  Op: ==
    13  .  .  .  .  Y: *ast.BasicLit {
    14  .  .  .  .  .  ValuePos: -
    15  .  .  .  .  .  Kind: INT
    16  .  .  .  .  .  Value: "1"
    17  .  .  .  .  }
    18  .  .  .  }
    19  .  .  .  OpPos: -
    20  .  .  .  Op: ||
    21  .  .  .  Y: *ast.BinaryExpr {
    22  .  .  .  .  X: *ast.Ident {
    23  .  .  .  .  .  NamePos: -
    24  .  .  .  .  .  Name: "what"
    25  .  .  .  .  }
    26  .  .  .  .  OpPos: -
    27  .  .  .  .  Op: ==
    28  .  .  .  .  Y: *ast.BasicLit {
    29  .  .  .  .  .  ValuePos: -
    30  .  .  .  .  .  Kind: INT
    31  .  .  .  .  .  Value: "1"
    32  .  .  .  .  }
    33  .  .  .  }
    34  .  .  }
    35  .  .  Rparen: -
    36  .  }
    37  }
(b == 1 || what == 1) and (b == 1 || what == 1)
     0  *expr.LogicExpr {
     1  .  BinaryExpr: ast.BinaryExpr {
     2  .  .  X: *expr.GroupExpr {
     3  .  .  .  ParenExpr: ast.ParenExpr {
     4  .  .  .  .  Lparen: -
     5  .  .  .  .  X: *expr.LogicExpr {
     6  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
     7  .  .  .  .  .  .  X: *expr.BinaryExpr {
     8  .  .  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
     9  .  .  .  .  .  .  .  .  X: *ast.Ident {
    10  .  .  .  .  .  .  .  .  .  NamePos: -
    11  .  .  .  .  .  .  .  .  .  Name: "b"
    12  .  .  .  .  .  .  .  .  }
    13  .  .  .  .  .  .  .  .  OpPos: -
    14  .  .  .  .  .  .  .  .  Op: ==
    15  .  .  .  .  .  .  .  .  Y: *ast.BasicLit {
    16  .  .  .  .  .  .  .  .  .  ValuePos: -
    17  .  .  .  .  .  .  .  .  .  Kind: INT
    18  .  .  .  .  .  .  .  .  .  Value: "1"
    19  .  .  .  .  .  .  .  .  }
    20  .  .  .  .  .  .  .  }
    21  .  .  .  .  .  .  }
    22  .  .  .  .  .  .  OpPos: -
    23  .  .  .  .  .  .  Op: ||
    24  .  .  .  .  .  .  Y: *expr.BinaryExpr {
    25  .  .  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    26  .  .  .  .  .  .  .  .  X: *ast.Ident {
    27  .  .  .  .  .  .  .  .  .  NamePos: -
    28  .  .  .  .  .  .  .  .  .  Name: "what"
    29  .  .  .  .  .  .  .  .  }
    30  .  .  .  .  .  .  .  .  OpPos: -
    31  .  .  .  .  .  .  .  .  Op: ==
    32  .  .  .  .  .  .  .  .  Y: *ast.BasicLit {
    33  .  .  .  .  .  .  .  .  .  ValuePos: -
    34  .  .  .  .  .  .  .  .  .  Kind: INT
    35  .  .  .  .  .  .  .  .  .  Value: "1"
    36  .  .  .  .  .  .  .  .  }
    37  .  .  .  .  .  .  .  }
    38  .  .  .  .  .  .  }
    39  .  .  .  .  .  }
    40  .  .  .  .  }
    41  .  .  .  .  Rparen: -
    42  .  .  .  }
    43  .  .  }
    44  .  .  OpPos: -
    45  .  .  Op: &&
    46  .  .  Y: *expr.GroupExpr {
    47  .  .  .  ParenExpr: ast.ParenExpr {
    48  .  .  .  .  Lparen: -
    49  .  .  .  .  X: *expr.LogicExpr {
    50  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    51  .  .  .  .  .  .  X: *expr.BinaryExpr {
    52  .  .  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    53  .  .  .  .  .  .  .  .  X: *ast.Ident {
    54  .  .  .  .  .  .  .  .  .  NamePos: -
    55  .  .  .  .  .  .  .  .  .  Name: "b"
    56  .  .  .  .  .  .  .  .  }
    57  .  .  .  .  .  .  .  .  OpPos: -
    58  .  .  .  .  .  .  .  .  Op: ==
    59  .  .  .  .  .  .  .  .  Y: *ast.BasicLit {
    60  .  .  .  .  .  .  .  .  .  ValuePos: -
    61  .  .  .  .  .  .  .  .  .  Kind: INT
    62  .  .  .  .  .  .  .  .  .  Value: "1"
    63  .  .  .  .  .  .  .  .  }
    64  .  .  .  .  .  .  .  }
    65  .  .  .  .  .  .  }
    66  .  .  .  .  .  .  OpPos: -
    67  .  .  .  .  .  .  Op: ||
    68  .  .  .  .  .  .  Y: *expr.BinaryExpr {
    69  .  .  .  .  .  .  .  BinaryExpr: ast.BinaryExpr {
    70  .  .  .  .  .  .  .  .  X: *ast.Ident {
    71  .  .  .  .  .  .  .  .  .  NamePos: -
    72  .  .  .  .  .  .  .  .  .  Name: "what"
    73  .  .  .  .  .  .  .  .  }
    74  .  .  .  .  .  .  .  .  OpPos: -
    75  .  .  .  .  .  .  .  .  Op: ==
    76  .  .  .  .  .  .  .  .  Y: *ast.BasicLit {
    77  .  .  .  .  .  .  .  .  .  ValuePos: -
    78  .  .  .  .  .  .  .  .  .  Kind: INT
    79  .  .  .  .  .  .  .  .  .  Value: "1"
    80  .  .  .  .  .  .  .  .  }
    81  .  .  .  .  .  .  .  }
    82  .  .  .  .  .  .  }
    83  .  .  .  .  .  }
    84  .  .  .  .  }
    85  .  .  .  .  Rparen: -
    86  .  .  .  }
    87  .  .  }
    88  .  }
    89  }
     0  *ast.BinaryExpr {
     1  .  X: *ast.ParenExpr {
     2  .  .  Lparen: -
     3  .  .  X: *ast.BinaryExpr {
     4  .  .  .  X: *ast.BinaryExpr {
     5  .  .  .  .  X: *ast.Ident {
     6  .  .  .  .  .  NamePos: -
     7  .  .  .  .  .  Name: "b"
     8  .  .  .  .  }
     9  .  .  .  .  OpPos: -
    10  .  .  .  .  Op: ==
    11  .  .  .  .  Y: *ast.BasicLit {
    12  .  .  .  .  .  ValuePos: -
    13  .  .  .  .  .  Kind: INT
    14  .  .  .  .  .  Value: "1"
    15  .  .  .  .  }
    16  .  .  .  }
    17  .  .  .  OpPos: -
    18  .  .  .  Op: ||
    19  .  .  .  Y: *ast.BinaryExpr {
    20  .  .  .  .  X: *ast.Ident {
    21  .  .  .  .  .  NamePos: -
    22  .  .  .  .  .  Name: "what"
    23  .  .  .  .  }
    24  .  .  .  .  OpPos: -
    25  .  .  .  .  Op: ==
    26  .  .  .  .  Y: *ast.BasicLit {
    27  .  .  .  .  .  ValuePos: -
    28  .  .  .  .  .  Kind: INT
    29  .  .  .  .  .  Value: "1"
    30  .  .  .  .  }
    31  .  .  .  }
    32  .  .  }
    33  .  .  Rparen: -
    34  .  }
    35  .  OpPos: -
    36  .  Op: &&
    37  .  Y: *ast.ParenExpr {
    38  .  .  Lparen: -
    39  .  .  X: *ast.BinaryExpr {
    40  .  .  .  X: *ast.BinaryExpr {
    41  .  .  .  .  X: *ast.Ident {
    42  .  .  .  .  .  NamePos: -
    43  .  .  .  .  .  Name: "b"
    44  .  .  .  .  }
    45  .  .  .  .  OpPos: -
    46  .  .  .  .  Op: ==
    47  .  .  .  .  Y: *ast.BasicLit {
    48  .  .  .  .  .  ValuePos: -
    49  .  .  .  .  .  Kind: INT
    50  .  .  .  .  .  Value: "1"
    51  .  .  .  .  }
    52  .  .  .  }
    53  .  .  .  OpPos: -
    54  .  .  .  Op: ||
    55  .  .  .  Y: *ast.BinaryExpr {
    56  .  .  .  .  X: *ast.Ident {
    57  .  .  .  .  .  NamePos: -
    58  .  .  .  .  .  Name: "what"
    59  .  .  .  .  }
    60  .  .  .  .  OpPos: -
    61  .  .  .  .  Op: ==
    62  .  .  .  .  Y: *ast.BasicLit {
    63  .  .  .  .  .  ValuePos: -
    64  .  .  .  .  .  Kind: INT
    65  .  .  .  .  .  Value: "1"
    66  .  .  .  .  }
    67  .  .  .  }
    68  .  .  }
    69  .  .  Rparen: -
    70  .  }
    71  }

功能设计:

  • 支持字段(基本类型)的各种匹配操作, 包括字段间的
  • 支持结构体实例的方法调用,并支持给方法传参数,参数包含常量参数,以及对其他字段的引用
    • 函数的结果如果不继续参与运算,则必须具有 bool 类型的唯一返回值
    • 函数的结果如果参与运算,则要求
  • 对结果的取反

语法抽象:

  • field.OP(values...) OP VALUE
  • 特殊的, field.call(values...) 为 调用 field 这个名字对应的函数
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment