@@ -63,6 +63,33 @@ func (p *parser) parseOne(withAheadParse bool) (res Node) {
63
63
return p .parseOneWithOptions (withAheadParse , withAheadParse , withAheadParse )
64
64
}
65
65
66
+ func (p * parser ) parseNumberSuffix () (ty TypeNode ) {
67
+ next := p .lookAhead (1 )
68
+ if next .Type == lexer .IDENTIFIER {
69
+ switch next .Val {
70
+ case "u8" :
71
+ ty = & SingleTypeNode {SourceName : "uint8" , TypeName : "uint8" }
72
+ p .i ++
73
+ case "u16" :
74
+ ty = & SingleTypeNode {SourceName : "uint16" , TypeName : "uint16" }
75
+ p .i ++
76
+ case "u32" :
77
+ ty = & SingleTypeNode {SourceName : "uint32" , TypeName : "uint32" }
78
+ p .i ++
79
+ case "u64" :
80
+ ty = & SingleTypeNode {SourceName : "uint64" , TypeName : "uint64" }
81
+ p .i ++
82
+ case "u128" :
83
+ ty = & SingleTypeNode {SourceName : "uint128" , TypeName : "uint128" }
84
+ p .i ++
85
+ case "u256" :
86
+ ty = & SingleTypeNode {SourceName : "uint256" , TypeName : "uint256" }
87
+ p .i ++
88
+ }
89
+ }
90
+ return
91
+ }
92
+
66
93
func (p * parser ) parseOneWithOptions (withAheadParse , withArithAhead , withIdentifierAhead bool ) (res Node ) {
67
94
current := p .input [p .i ]
68
95
@@ -91,41 +118,35 @@ func (p *parser) parseOneWithOptions(withAheadParse, withArithAhead, withIdentif
91
118
}
92
119
return
93
120
121
+
122
+ // HEX always returns a ConstantNode
123
+ // Convert string hex representation to int64
124
+ case lexer .HEX :
125
+ val , err := strconv .ParseInt (current .Val , 16 , 64 )
126
+ if err != nil {
127
+ panic (err )
128
+ }
129
+ res = & ConstantNode {
130
+ Type : NUMBER ,
131
+ TargetType : p .parseNumberSuffix (),
132
+ Value : val ,
133
+ }
134
+ if withAheadParse {
135
+ res = p .aheadParse (res )
136
+ }
137
+ return
138
+
94
139
// NUMBER always returns a ConstantNode
95
140
// Convert string representation to int64
96
141
case lexer .NUMBER :
97
142
val , err := strconv .ParseInt (current .Val , 10 , 64 )
98
143
if err != nil {
99
144
panic (err )
100
145
}
101
- next := p .lookAhead (1 )
102
- var ty TypeNode
103
- if next .Type == lexer .IDENTIFIER {
104
- switch next .Val {
105
- case "u8" :
106
- ty = & SingleTypeNode {SourceName : "uint8" , TypeName : "uint8" }
107
- p .i ++
108
- case "u16" :
109
- ty = & SingleTypeNode {SourceName : "uint16" , TypeName : "uint16" }
110
- p .i ++
111
- case "u32" :
112
- ty = & SingleTypeNode {SourceName : "uint32" , TypeName : "uint32" }
113
- p .i ++
114
- case "u64" :
115
- ty = & SingleTypeNode {SourceName : "uint64" , TypeName : "uint64" }
116
- p .i ++
117
- case "u128" :
118
- ty = & SingleTypeNode {SourceName : "uint128" , TypeName : "uint128" }
119
- p .i ++
120
- case "u256" :
121
- ty = & SingleTypeNode {SourceName : "uint256" , TypeName : "uint256" }
122
- p .i ++
123
- }
124
- }
125
146
126
147
res = & ConstantNode {
127
148
Type : NUMBER ,
128
- TargetType : ty ,
149
+ TargetType : p . parseNumberSuffix () ,
129
150
Value : val ,
130
151
}
131
152
if withAheadParse {
0 commit comments