aboutsummaryrefslogtreecommitdiff
path: root/parser/parser.go
diff options
context:
space:
mode:
authorBobby <[email protected]>2024-04-10 20:42:41 +0000
committerBobby <[email protected]>2024-04-10 20:42:41 +0000
commitca46690f9166681e4b32af90e28fb215c12f76c0 (patch)
tree1b8ac7bf26616bcc0bdc3038221997d30d66d751 /parser/parser.go
parente7b7baba5e6485ae6e241eee4c3f30557afa0fa8 (diff)
downloadmana-ca46690f9166681e4b32af90e28fb215c12f76c0.tar.xz
mana-ca46690f9166681e4b32af90e28fb215c12f76c0.zip
hashes
Diffstat (limited to 'parser/parser.go')
-rw-r--r--parser/parser.go30
1 files changed, 30 insertions, 0 deletions
diff --git a/parser/parser.go b/parser/parser.go
index 4fa36b1..2de9e56 100644
--- a/parser/parser.go
+++ b/parser/parser.go
@@ -75,6 +75,7 @@ func New(l *lexer.Lexer) *Parser {
p.registerPrefix(tokens.LPAREN, p.parseGroupedExpression)
p.registerPrefix(tokens.STRING, p.parseStringLiteral)
p.registerPrefix(tokens.LBRACKET, p.parseArrayLiteral)
+ p.registerPrefix(tokens.LBRACE, p.parseHashLiteral)
// Initialize the infix parse functions.
p.infixParseFns = make(map[tokens.TokenType]infixParseFn)
@@ -494,6 +495,35 @@ func (p *Parser) parseIndexExpression(left ast.Expression) ast.Expression {
return exp
}
+func (p *Parser) parseHashLiteral() ast.Expression {
+ hash := &ast.HashLiteral{Token: p.curToken}
+ hash.Pairs = make(map[ast.Expression]ast.Expression)
+
+ for !p.peekTokenIs(tokens.RBRACE) {
+ p.nextToken()
+ key := p.parseExpression(LOWEST)
+
+ if !p.expectPeek(tokens.COLON) {
+ return nil
+ }
+
+ p.nextToken()
+ value := p.parseExpression(LOWEST)
+
+ hash.Pairs[key] = value
+
+ if !p.peekTokenIs(tokens.RBRACE) && !p.expectPeek(tokens.COMMA) {
+ return nil
+ }
+ }
+
+ if !p.expectPeek(tokens.RBRACE) {
+ return nil
+ }
+
+ return hash
+}
+
// curTokenIs returns true if the current token is of the given type.
func (p *Parser) curTokenIs(t tokens.TokenType) bool {
return p.curToken.Type == t