diff options
Diffstat (limited to 'parser/parser.go')
| -rw-r--r-- | parser/parser.go | 30 |
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 |
