aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--parser/parser.go70
1 files changed, 30 insertions, 40 deletions
diff --git a/parser/parser.go b/parser/parser.go
index 0ba449f..fb113e3 100644
--- a/parser/parser.go
+++ b/parser/parser.go
@@ -50,38 +50,36 @@ type Parser struct {
}
func New(l *lexer.Lexer) *Parser {
- p := &Parser{
- l: l,
- errors: []string{},
- }
-
- p.prefixParseFns = make(map[token.TokenType]prefixParseFn)
- p.registerPrefix(token.IDENT, p.parseIdentifier)
- p.registerPrefix(token.INTEGER, p.parseIntegerLiteral)
- p.registerPrefix(token.STRING, p.parseStringLiteral)
- p.registerPrefix(token.BANG, p.parsePrefixExpression)
- p.registerPrefix(token.MINUS, p.parsePrefixExpression)
- p.registerPrefix(token.TRUE, p.parseBoolean)
- p.registerPrefix(token.FALSE, p.parseBoolean)
- p.registerPrefix(token.LPAREN, p.parseGroupedExpression)
- p.registerPrefix(token.IF, p.parseIfExpression)
- p.registerPrefix(token.FUNCTION, p.parseFunctionLiteral)
- p.registerPrefix(token.LBRACKET, p.parseArrayLiteral)
- p.registerPrefix(token.LBRACE, p.parseHashLiteral)
- p.registerPrefix(token.MACRO, p.parseMacroLiteral)
-
- p.infixParseFns = make(map[token.TokenType]infixParseFn)
- p.registerInfix(token.PLUS, p.parseInfixExpression)
- p.registerInfix(token.MINUS, p.parseInfixExpression)
- p.registerInfix(token.SLASH, p.parseInfixExpression)
- p.registerInfix(token.ASTERISK, p.parseInfixExpression)
- p.registerInfix(token.EQ, p.parseInfixExpression)
- p.registerInfix(token.NOT_EQ, p.parseInfixExpression)
- p.registerInfix(token.LESS, p.parseInfixExpression)
- p.registerInfix(token.MORE, p.parseInfixExpression)
-
- p.registerInfix(token.LPAREN, p.parseCallExpression)
- p.registerInfix(token.LBRACKET, p.parseIndexExpression)
+ p := &Parser{l: l}
+
+ p.prefixParseFns = map[token.TokenType]prefixParseFn{
+ token.IDENT: p.parseIdentifier,
+ token.INTEGER: p.parseIntegerLiteral,
+ token.STRING: p.parseStringLiteral,
+ token.BANG: p.parsePrefixExpression,
+ token.MINUS: p.parsePrefixExpression,
+ token.TRUE: p.parseBoolean,
+ token.FALSE: p.parseBoolean,
+ token.LPAREN: p.parseGroupedExpression,
+ token.IF: p.parseIfExpression,
+ token.FUNCTION: p.parseFunctionLiteral,
+ token.LBRACKET: p.parseArrayLiteral,
+ token.LBRACE: p.parseHashLiteral,
+ token.MACRO: p.parseMacroLiteral,
+ }
+
+ p.infixParseFns = map[token.TokenType]infixParseFn{
+ token.PLUS: p.parseInfixExpression,
+ token.MINUS: p.parseInfixExpression,
+ token.SLASH: p.parseInfixExpression,
+ token.ASTERISK: p.parseInfixExpression,
+ token.EQ: p.parseInfixExpression,
+ token.NOT_EQ: p.parseInfixExpression,
+ token.LESS: p.parseInfixExpression,
+ token.MORE: p.parseInfixExpression,
+ token.LPAREN: p.parseCallExpression,
+ token.LBRACKET: p.parseIndexExpression,
+ }
// Read two tokens, so curToken and peekToken are both set
p.nextToken()
@@ -500,11 +498,3 @@ func (p *Parser) parseMacroLiteral() ast.Expression {
return lit
}
-
-func (p *Parser) registerPrefix(tokenType token.TokenType, fn prefixParseFn) {
- p.prefixParseFns[tokenType] = fn
-}
-
-func (p *Parser) registerInfix(tokenType token.TokenType, fn infixParseFn) {
- p.infixParseFns[tokenType] = fn
-}