|
|
@@ -73,6 +73,7 @@ func New(l *lexer.Lexer) *Parser {
|
|
|
p.registerPrefix(token.IF, p.parseIfExpression)
|
|
|
p.registerPrefix(token.FUNCTION, p.parseFunctionLiteral)
|
|
|
p.registerPrefix(token.STRING, p.parseStringLiteral)
|
|
|
+ p.registerPrefix(token.LBRACKET, p.parseArrayLiteral)
|
|
|
|
|
|
p.infixParseFns = make(map[token.TypeToken]infixParseFn)
|
|
|
p.registerInfix(token.PLUS, p.parseInfixExpression)
|
|
|
@@ -205,11 +206,18 @@ func (p *Parser) parseIntegerLiteral() ast.Expression {
|
|
|
func (p *Parser) parseStringLiteral() ast.Expression {
|
|
|
return &ast.StringLiteral{Token: p.curToken, Value: p.curToken.Literal}
|
|
|
}
|
|
|
+func (p *Parser) parseArrayLiteral() ast.Expression {
|
|
|
+ array := &ast.ArrayLiteral{Token: p.curToken}
|
|
|
+
|
|
|
+ array.Element = p.parseExpressionList(token.RBRACKET)
|
|
|
+
|
|
|
+ return array
|
|
|
+}
|
|
|
func (p *Parser) parseCallExpression(left ast.Expression) ast.Expression {
|
|
|
defer untrace(trace("parseCallExpression"))
|
|
|
// add(2,3) --> Function: add
|
|
|
exp := &ast.CallExpression{Token: p.curToken, Function: left}
|
|
|
- exp.Arguments = p.parseCallArguments()
|
|
|
+ exp.Arguments = p.parseExpressionList(token.RPAREN)
|
|
|
return exp
|
|
|
}
|
|
|
func (p *Parser) parseInfixExpression(left ast.Expression) ast.Expression {
|
|
|
@@ -346,6 +354,27 @@ func (p *Parser) parseExpression(precedence int) ast.Expression {
|
|
|
|
|
|
return leftExp
|
|
|
}
|
|
|
+func (p *Parser) parseExpressionList(end token.TypeToken) []ast.Expression {
|
|
|
+ defer untrace(trace("parseExpressionList"))
|
|
|
+ list := []ast.Expression{}
|
|
|
+
|
|
|
+ if p.peekTokenIs(end) {
|
|
|
+ p.nextToken()
|
|
|
+ return list
|
|
|
+ }
|
|
|
+ p.nextToken()
|
|
|
+ list = append(list, p.parseExpression(LOWEST))
|
|
|
+
|
|
|
+ for p.peekTokenIs(token.COMMA) {
|
|
|
+ p.nextToken()
|
|
|
+ p.nextToken()
|
|
|
+ list = append(list, p.parseExpression(LOWEST))
|
|
|
+ }
|
|
|
+ if !p.expectPeek(end) {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ return list
|
|
|
+}
|
|
|
|
|
|
func (p *Parser) curTokenIs(t token.TypeToken) bool {
|
|
|
return p.curToken.Type == t
|