diff options
| author | Bobby <[email protected]> | 2024-04-04 14:46:58 +0000 |
|---|---|---|
| committer | Bobby <[email protected]> | 2024-04-04 14:46:58 +0000 |
| commit | 3d4f24f7c4ea05471109c0b13abbc95e70c6924b (patch) | |
| tree | 5f4d07cf04336ff25e64b8ffc76a821e1b1861f5 /parser/parser.go | |
| parent | 98b3baa1d9d05551948b6657b4130cf05c11934d (diff) | |
| download | mana-3d4f24f7c4ea05471109c0b13abbc95e70c6924b.tar.xz mana-3d4f24f7c4ea05471109c0b13abbc95e70c6924b.zip | |
parsing array expressions
Diffstat (limited to 'parser/parser.go')
| -rw-r--r-- | parser/parser.go | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/parser/parser.go b/parser/parser.go index 6ca88b3..a4472b2 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -72,6 +72,7 @@ func New(l *lexer.Lexer) *Parser { p.registerPrefix(tokens.FUNCTION, p.parseFunctionLiteral) p.registerPrefix(tokens.LPAREN, p.parseGroupedExpression) p.registerPrefix(tokens.STRING, p.parseStringLiteral) + p.registerPrefix(tokens.LBRACKET, p.parseArrayLiteral) // Initialize the infix parse functions. p.infixParseFns = make(map[tokens.TokenType]infixParseFn) @@ -407,7 +408,7 @@ func (p *Parser) parseGroupedExpression() ast.Expression { // parseCallExpression parses a call expression. func (p *Parser) parseCallExpression(function ast.Expression) ast.Expression { exp := &ast.CallExpression{Token: p.curToken, Function: function} - exp.Arguments = p.parseCallArguments() + exp.Arguments = p.parseExpressionList(tokens.RPAREN) return exp } @@ -444,6 +445,39 @@ func (p *Parser) parseStringLiteral() ast.Expression { } } +func (p *Parser) parseArrayLiteral() ast.Expression { + array := &ast.ArrayLiteral{Token: p.curToken} + + array.Elements = p.parseExpressionList(tokens.RBRACKET) + + return array +} + +func (p *Parser) parseExpressionList(end tokens.TokenType) []ast.Expression { + list := []ast.Expression{} + + if p.peekTokenIs(end) { + p.nextToken() + return list + } + + p.nextToken() + + list = append(list, p.parseExpression(LOWEST)) + + for p.peekTokenIs(tokens.COMMA) { + p.nextToken() + p.nextToken() + list = append(list, p.parseExpression(LOWEST)) + } + + if !p.expectPeek(end) { + return nil + } + + return list +} + // 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 |
