Skip to content

Commit 977a9be

Browse files
committed
extract collection literal parsing helpers
1 parent bc5f25d commit 977a9be

3 files changed

Lines changed: 79 additions & 79 deletions

File tree

docs/architecture.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ Key files:
6666
- `vibes/parser_expressions.go` (expression-level parsing and yield/case literals)
6767
- `vibes/parser_call_literals.go` (call argument parsing, keyword labels, and call blocks)
6868
- `vibes/parser_literals.go` (identifier and scalar literal parsing)
69+
- `vibes/parser_collection_literals.go` (array/hash literal parsing and symbol-style hash pairs)
6970
- `vibes/parser_block_literals.go` (block literals, block params, and typed union param parsing)
7071
- `vibes/parser_statements.go` (statement dispatch + return/raise/block parsing)
7172
- `vibes/parser_expression_statements.go` (expression/assert/assignment statement parsing)
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package vibes
2+
3+
import "fmt"
4+
5+
func (p *parser) parseArrayLiteral() Expression {
6+
pos := p.curToken.Pos
7+
elements := []Expression{}
8+
9+
if p.peekToken.Type == tokenRBracket {
10+
p.nextToken()
11+
return &ArrayLiteral{Elements: elements, position: pos}
12+
}
13+
14+
p.nextToken()
15+
elements = append(elements, p.parseExpression(lowestPrec))
16+
17+
for p.peekToken.Type == tokenComma {
18+
p.nextToken()
19+
p.nextToken()
20+
elements = append(elements, p.parseExpression(lowestPrec))
21+
}
22+
23+
if !p.expectPeek(tokenRBracket) {
24+
return nil
25+
}
26+
27+
return &ArrayLiteral{Elements: elements, position: pos}
28+
}
29+
30+
func (p *parser) parseHashLiteral() Expression {
31+
pos := p.curToken.Pos
32+
pairs := []HashPair{}
33+
34+
if p.peekToken.Type == tokenRBrace {
35+
p.nextToken()
36+
return &HashLiteral{Pairs: pairs, position: pos}
37+
}
38+
39+
p.nextToken()
40+
if pair := p.parseHashPair(); pair.Key != nil {
41+
pairs = append(pairs, pair)
42+
}
43+
44+
for p.peekToken.Type == tokenComma {
45+
p.nextToken()
46+
p.nextToken()
47+
if pair := p.parseHashPair(); pair.Key != nil {
48+
pairs = append(pairs, pair)
49+
}
50+
}
51+
52+
if !p.expectPeek(tokenRBrace) {
53+
return nil
54+
}
55+
56+
return &HashLiteral{Pairs: pairs, position: pos}
57+
}
58+
59+
func (p *parser) parseHashPair() HashPair {
60+
if !isLabelNameToken(p.curToken.Type) || p.peekToken.Type != tokenColon {
61+
p.addParseError(p.curToken.Pos, "invalid hash pair: expected symbol-style key like name:")
62+
return HashPair{}
63+
}
64+
65+
key := &SymbolLiteral{Name: p.curToken.Literal, position: p.curToken.Pos}
66+
p.nextToken()
67+
p.nextToken()
68+
if p.curToken.Type == tokenComma || p.curToken.Type == tokenRBrace {
69+
p.addParseError(p.curToken.Pos, fmt.Sprintf("missing value for hash key %s", key.Name))
70+
return HashPair{}
71+
}
72+
73+
value := p.parseExpression(lowestPrec)
74+
if value == nil {
75+
return HashPair{}
76+
}
77+
return HashPair{Key: key, Value: value}
78+
}

vibes/parser_expressions.go

Lines changed: 0 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package vibes
22

3-
import (
4-
"fmt"
5-
)
6-
73
func (p *parser) parseExpression(precedence int) Expression {
84
prefix := p.prefixFns[p.curToken.Type]
95
if prefix == nil {
@@ -124,81 +120,6 @@ func (p *parser) parseGroupedExpression() Expression {
124120
return expr
125121
}
126122

127-
func (p *parser) parseArrayLiteral() Expression {
128-
pos := p.curToken.Pos
129-
elements := []Expression{}
130-
131-
if p.peekToken.Type == tokenRBracket {
132-
p.nextToken()
133-
return &ArrayLiteral{Elements: elements, position: pos}
134-
}
135-
136-
p.nextToken()
137-
elements = append(elements, p.parseExpression(lowestPrec))
138-
139-
for p.peekToken.Type == tokenComma {
140-
p.nextToken()
141-
p.nextToken()
142-
elements = append(elements, p.parseExpression(lowestPrec))
143-
}
144-
145-
if !p.expectPeek(tokenRBracket) {
146-
return nil
147-
}
148-
149-
return &ArrayLiteral{Elements: elements, position: pos}
150-
}
151-
152-
func (p *parser) parseHashLiteral() Expression {
153-
pos := p.curToken.Pos
154-
pairs := []HashPair{}
155-
156-
if p.peekToken.Type == tokenRBrace {
157-
p.nextToken()
158-
return &HashLiteral{Pairs: pairs, position: pos}
159-
}
160-
161-
p.nextToken()
162-
if pair := p.parseHashPair(); pair.Key != nil {
163-
pairs = append(pairs, pair)
164-
}
165-
166-
for p.peekToken.Type == tokenComma {
167-
p.nextToken()
168-
p.nextToken()
169-
if pair := p.parseHashPair(); pair.Key != nil {
170-
pairs = append(pairs, pair)
171-
}
172-
}
173-
174-
if !p.expectPeek(tokenRBrace) {
175-
return nil
176-
}
177-
178-
return &HashLiteral{Pairs: pairs, position: pos}
179-
}
180-
181-
func (p *parser) parseHashPair() HashPair {
182-
if !isLabelNameToken(p.curToken.Type) || p.peekToken.Type != tokenColon {
183-
p.addParseError(p.curToken.Pos, "invalid hash pair: expected symbol-style key like name:")
184-
return HashPair{}
185-
}
186-
187-
key := &SymbolLiteral{Name: p.curToken.Literal, position: p.curToken.Pos}
188-
p.nextToken()
189-
p.nextToken()
190-
if p.curToken.Type == tokenComma || p.curToken.Type == tokenRBrace {
191-
p.addParseError(p.curToken.Pos, fmt.Sprintf("missing value for hash key %s", key.Name))
192-
return HashPair{}
193-
}
194-
195-
value := p.parseExpression(lowestPrec)
196-
if value == nil {
197-
return HashPair{}
198-
}
199-
return HashPair{Key: key, Value: value}
200-
}
201-
202123
func (p *parser) parsePrefixExpression() Expression {
203124
pos := p.curToken.Pos
204125
operator := p.curToken.Type

0 commit comments

Comments
 (0)