Skip to content

Commit 8e6a1f4

Browse files
committed
optimze: reduce allocations
1 parent 71aaf20 commit 8e6a1f4

File tree

3 files changed

+49
-40
lines changed

3 files changed

+49
-40
lines changed

ast.go

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -94,18 +94,18 @@ type baseNode struct {
9494
end Pos
9595
}
9696

97-
func (e *baseNode) Start() Pos {
97+
func (e baseNode) Start() Pos {
9898
return e.start
9999
}
100100

101-
func (e *baseNode) End() Pos {
101+
func (e baseNode) End() Pos {
102102
return e.end
103103
}
104104

105-
func (e *baseNode) cannotBeImplemented() {}
105+
func (e baseNode) cannotBeImplemented() {}
106106

107-
func newBaseNode(start, end Pos) *baseNode {
108-
return &baseNode{
107+
func newBaseNode(start, end Pos) baseNode {
108+
return baseNode{
109109
start: start,
110110
end: end,
111111
}
@@ -119,14 +119,14 @@ var _ Node = (*IdentExpr)(nil)
119119
var _ Node = (*RangeExpr)(nil)
120120

121121
type FunCallExpr struct {
122-
*baseNode
122+
baseNode
123123
Name *Token // Function name token
124124
ParanOpen *Token
125125
Arguments []Node // Arguments can be any expression type
126126
ParanClose *Token
127127
}
128128

129-
func (f *FunCallExpr) String() string {
129+
func (f FunCallExpr) String() string {
130130
var sb strings.Builder
131131
sb.WriteString("FunCallExpr(Name: ")
132132
sb.WriteString(f.Name.Raw)
@@ -142,7 +142,7 @@ func (f *FunCallExpr) String() string {
142142
}
143143

144144
type BinaryExpr struct {
145-
*baseNode
145+
baseNode
146146
Left Node // Left operand
147147
Operator *Token // Operator token (e.g., +, -, *, /)
148148
Right Node // Right operand
@@ -153,53 +153,53 @@ func (b *BinaryExpr) String() string {
153153
}
154154

155155
type UnaryExpr struct {
156-
*baseNode
156+
baseNode
157157
Operator *Token // Operator token (e.g., !, -)
158158
Operand Node // Operand expression
159159
}
160160

161-
func (u *UnaryExpr) String() string {
161+
func (u UnaryExpr) String() string {
162162
return fmt.Sprintf("UnaryExpr(Operator: %s, Operand: %s)", u.Operator.Raw, u.Operand)
163163
}
164164

165165
type LiteralExpr struct {
166-
*baseNode
166+
baseNode
167167
Value *Token // Token representing the literal value (e.g., number, string, boolean)
168168
}
169169

170-
func (l *LiteralExpr) String() string {
170+
func (l LiteralExpr) String() string {
171171
return fmt.Sprintf("LiteralExpr(Value: %s)", l.Value.Raw)
172172
}
173173

174174
type IdentExpr struct {
175-
*baseNode
175+
baseNode
176176
Name *Token
177177
}
178178

179-
func (i *IdentExpr) String() string {
179+
func (i IdentExpr) String() string {
180180
return fmt.Sprintf("IdentExpr(Name: %s)", i.Name.Raw)
181181
}
182182

183183
type ParenthesizedExpr struct {
184-
*baseNode
184+
baseNode
185185
ParenOpen *Token // The opening parenthesis
186186
Inner Node // The expression inside the parentheses
187187
ParenClose *Token // The closing parenthesis
188188
}
189189

190-
func (p *ParenthesizedExpr) String() string {
190+
func (p ParenthesizedExpr) String() string {
191191
return fmt.Sprintf("ParenthesizedExpr(Inner: %s)", p.Inner)
192192
}
193193

194194
type RangeExpr struct {
195-
*baseNode
195+
baseNode
196196

197197
Begin Node // Start of the range (e.g., A1, A, 1)
198198
Colons []*Token // Colon tokens (e.g., : between A1 and B2)
199199
Ends []Node // End of the range (e.g., B2, B, 2)
200200
}
201201

202-
func (r *RangeExpr) String() string {
202+
func (r RangeExpr) String() string {
203203
var sb strings.Builder
204204
sb.WriteString("RangeExpr(")
205205
sb.WriteString(r.Begin.String())
@@ -212,26 +212,26 @@ func (r *RangeExpr) String() string {
212212
}
213213

214214
type CellExpr struct {
215-
*baseNode
215+
baseNode
216216
Ident *Token // The cell identifier (e.g., A1, B2)
217217
Row int // starts from 0. -1 indicates a full column reference (e.g., A:A)
218218
Col int // starts from 0. -1 indicates a full row reference (e.g., 1:1)
219219
RowAbsolute bool // true if the row is absolute (e.g., $1, $2)
220220
ColAbsolute bool // true if the column is absolute (e.g., $A, $B)
221221
}
222222

223-
func (c *CellExpr) String() string {
223+
func (c CellExpr) String() string {
224224
return fmt.Sprintf("CellExpr(%s)", c.Ident.Raw)
225225
}
226226

227227
type ArrayExpr struct {
228-
*baseNode
228+
baseNode
229229
BraceOpen *Token // The opening brace token {
230230
Elements [][]Node // [row][column] of expressions
231231
BraceClose *Token // The closing brace token }
232232
}
233233

234-
func (a *ArrayExpr) String() string {
234+
func (a ArrayExpr) String() string {
235235
var sb strings.Builder
236236
sb.WriteString("ArrayExpr(")
237237
for i, row := range a.Elements {

lexer.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,20 @@ var keywords = map[string]TokenType{
1010
"FALSE": BoolLiteral,
1111
}
1212

13+
type tokenState struct {
14+
tokenType TokenType
15+
tokenStartPos Pos
16+
tokenEndPos Pos
17+
tokenStart int // start offset
18+
tokenEnd int // end offset
19+
}
20+
1321
type lexer struct {
1422
src []rune
1523
pos Pos
1624
offset int
1725
ch rune
26+
tokenState
1827
}
1928

2029
func newLexer(src string) *lexer {

parser.go

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -210,14 +210,14 @@ func (p *Parser) negation() (Node, error) {
210210
if err != nil {
211211
return nil, err
212212
}
213-
if lit, ok := right.(*LiteralExpr); ok && lit.Value.Type == Number {
213+
if lit, ok := right.(LiteralExpr); ok && lit.Value.Type == Number {
214214
if isDigit([]rune(lit.Value.Raw)[0]) { // combine '-' / '+' with number literal
215215
lit.start = op.Start // Adjust start position to the operator
216216
lit.Value.Raw = op.Raw + lit.Value.Raw // Prepend the operator to the literal value
217217
return lit, nil
218218
}
219219
}
220-
return &UnaryExpr{
220+
return UnaryExpr{
221221
baseNode: newBaseNode(op.Start, op.End),
222222
Operator: op,
223223
Operand: right,
@@ -240,7 +240,7 @@ func (p *Parser) implicitIntersection() (Node, error) {
240240
if err != nil {
241241
return nil, err
242242
}
243-
return &UnaryExpr{
243+
return UnaryExpr{
244244
baseNode: newBaseNode(start, operand.End()),
245245
Operator: op,
246246
Operand: operand,
@@ -280,7 +280,7 @@ func (p *Parser) rangeExpr() (Node, error) {
280280
}
281281
ends = append(ends, right)
282282
}
283-
return &RangeExpr{
283+
return RangeExpr{
284284
baseNode: newBaseNode(begin.Start(), ends[len(ends)-1].End()),
285285
Begin: begin,
286286
Colons: colons,
@@ -290,31 +290,31 @@ func (p *Parser) rangeExpr() (Node, error) {
290290
return left, nil
291291
}
292292

293-
func (p *Parser) tryConvertToCellExpr(node Node) (*CellExpr, error) {
294-
if node, ok := node.(*CellExpr); ok {
293+
func (p *Parser) tryConvertToCellExpr(node Node) (Node, error) {
294+
if node, ok := node.(CellExpr); ok {
295295
return node, nil // Already a CellExpr, no conversion needed
296296
}
297-
if node, ok := node.(*IdentExpr); ok {
297+
if node, ok := node.(IdentExpr); ok {
298298
col := colNameToIndex(node.Name.Raw)
299299
if col < 0 {
300300
return nil, newParseError(node.Start(), "expected a cell reference: %s", node.Name.Raw)
301301
}
302-
return &CellExpr{
302+
return CellExpr{
303303
baseNode: newBaseNode(node.Start(), node.End()),
304304
Ident: node.Name,
305305
Row: -1, // -1 indicates a full column reference
306306
Col: col,
307307
}, nil
308308
}
309-
if node, ok := node.(*LiteralExpr); ok {
309+
if node, ok := node.(LiteralExpr); ok {
310310
if node.Value.Type != Number {
311311
return nil, newParseError(node.Start(), "expected a row reference, got %s", node.Value.Raw)
312312
}
313313
row, err := strconv.Atoi(node.Value.Raw)
314314
if err != nil {
315315
return nil, newParseError(node.Start(), "invalid row reference: %s", err.Error())
316316
}
317-
return &CellExpr{
317+
return CellExpr{
318318
baseNode: newBaseNode(node.Start(), node.End()),
319319
Ident: node.Value,
320320
Row: row - 1, // Convert to zero-based index
@@ -346,7 +346,7 @@ func (p *Parser) primary() (Node, error) {
346346
if err := p.advance(); err != nil { // consume the token
347347
return nil, err
348348
}
349-
return &LiteralExpr{
349+
return LiteralExpr{
350350
baseNode: newBaseNode(tk.Start, tk.End),
351351
Value: tk,
352352
}, nil
@@ -361,7 +361,7 @@ func (p *Parser) primary() (Node, error) {
361361
if err := p.advance(); err != nil { // consume the token
362362
return nil, err
363363
}
364-
return &IdentExpr{
364+
return IdentExpr{
365365
baseNode: newBaseNode(tk.Start, tk.End),
366366
Name: tk,
367367
}, nil
@@ -374,7 +374,7 @@ func (p *Parser) primary() (Node, error) {
374374
if err := p.advance(); err != nil { // consume the token
375375
return nil, err
376376
}
377-
return &CellExpr{
377+
return CellExpr{
378378
baseNode: newBaseNode(tk.Start, tk.End),
379379
Ident: tk,
380380
Row: result.row,
@@ -390,7 +390,7 @@ func (p *Parser) primary() (Node, error) {
390390
if err := p.advance(); err != nil { // consume the token
391391
return nil, err
392392
}
393-
return &CellExpr{
393+
return CellExpr{
394394
baseNode: newBaseNode(tk.Start, tk.End),
395395
Ident: tk,
396396
Row: row - 1,
@@ -406,7 +406,7 @@ func (p *Parser) primary() (Node, error) {
406406
if err := p.advance(); err != nil { // consume the token
407407
return nil, err
408408
}
409-
return &CellExpr{
409+
return CellExpr{
410410
baseNode: newBaseNode(tk.Start, tk.End),
411411
Ident: tk,
412412
Row: -1, // -1 indicates a full column reference
@@ -474,7 +474,7 @@ func (p *Parser) arrayExpr() (Node, error) {
474474
if err := p.advance(); err != nil { // consume the '}' token
475475
return nil, err
476476
}
477-
return &ArrayExpr{
477+
return ArrayExpr{
478478
baseNode: newBaseNode(braceOpen.Start, braceClose.End),
479479
BraceOpen: braceOpen,
480480
Elements: values,
@@ -526,7 +526,7 @@ func (p *Parser) functionCall() (Node, error) {
526526
if err := p.advance(); err != nil { // consume the ')' token
527527
return nil, err
528528
}
529-
return &FunCallExpr{
529+
return FunCallExpr{
530530
baseNode: newBaseNode(name.Start, paranClose.End),
531531
Name: name,
532532
ParanOpen: paranOpen,
@@ -556,7 +556,7 @@ func (p *Parser) parenthesized() (Node, error) {
556556
if err := p.advance(); err != nil { // consume the ')' token
557557
return nil, err
558558
}
559-
return &ParenthesizedExpr{
559+
return ParenthesizedExpr{
560560
baseNode: newBaseNode(start, end),
561561
ParenOpen: parenOpen,
562562
Inner: expr,

0 commit comments

Comments
 (0)