aboutsummaryrefslogtreecommitdiff
path: root/parser/parser.go
diff options
context:
space:
mode:
Diffstat (limited to 'parser/parser.go')
-rw-r--r--parser/parser.go36
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