pub fn new(lexer: Lexer) -> Parser {
        let mut parser = Parser {
            lexer,
            errors: vec![],
            current_token: Token {
                line: 0,
                literal: "".to_owned(),
                token_type: TokenType::NONE,
            },
            peek_token: Token {
                line: 0,
                literal: "".to_owned(),
                token_type: TokenType::NONE,
            },
            prev_token: Token {
                line: 0,
                literal: "".to_owned(),
                token_type: TokenType::NONE,
            },
            prefix_parse_funcs: HashMap::new(),
            infix_parse_funcs: HashMap::new(),
            postfix_parse_funcs: HashMap::new(),
        };

        // Register all of our prefix parse funcs
        parser.register_prefix(TokenType::IDENTIFIER, parse_identifier);
        parser.register_prefix(TokenType::INTEGER, parse_integer_literal);
        parser.register_prefix(TokenType::BANG, parse_prefix_expr);
        parser.register_prefix(TokenType::MINUS, parse_prefix_expr);
        parser.register_prefix(TokenType::TRUE, parse_boolean);
        parser.register_prefix(TokenType::FALSE, parse_boolean);
        parser.register_prefix(TokenType::LEFT_PAREN, parse_grouped_expr);
        parser.register_prefix(TokenType::IF, parse_if_expr);
        parser.register_prefix(TokenType::FUNCTION, parse_function_literal);
        parser.register_prefix(TokenType::STRING, parse_string_literal);
        parser.register_prefix(TokenType::LEFT_BRACKET, parse_array_literal);
        parser.register_prefix(TokenType::LEFT_BRACE, parse_hash_literal);

        // Register all of our infix parse funcs
        parser.register_infix(TokenType::PLUS, parse_infix_expr);
        // p.registerInfix(token.Minus, p.parseInfixExpression)
        // p.registerInfix(token.Slash, p.parseInfixExpression)
        // p.registerInfix(token.Star, p.parseInfixExpression)
        // p.registerInfix(token.Mod, p.parseInfixExpression)
        // p.registerInfix(token.EqualEqual, p.parseInfixExpression)
        // p.registerInfix(token.BangEqual, p.parseInfixExpression)
        // p.registerInfix(token.Less, p.parseInfixExpression)
        // p.registerInfix(token.Greater, p.parseInfixExpression)
        // p.registerInfix(token.LessEqual, p.parseInfixExpression)
        // p.registerInfix(token.GreaterEqual, p.parseInfixExpression)
        // p.registerInfix(token.LeftParen, p.parseCallExpression)
        // p.registerInfix(token.LeftBracket, p.parseIndexExpr)
        // p.registerInfix(token.And, p.parseInfixExpression)
        // p.registerInfix(token.Or, p.parseInfixExpression)
        parser
    }
/// New takes a Lexer, creates a Parser with that Lexer, sets the
/// current and peek tokens, and returns the Parser.
New takes a Lexer, creates a Parser with that Lexer, sets the
current and peek tokens, and returns the Parser.
New takes a Lexer creates a Parser with that Lexer sets the current and peek tokens and returns the Parser .
pub fn new(lexer: Lexer) -> Parser {
        let mut parser = Parser {
            lexer,
            errors: vec![],
            current_token: Token {
                line: 0,
                literal: "".to_owned(),
                token_type: TokenType::NONE,
            },
            peek_token: Token {
                line: 0,
                literal: "".to_owned(),
                token_type: TokenType::NONE,
            },
            prev_token: Token {
                line: 0,
                literal: "".to_owned(),
                token_type: TokenType::NONE,
            },
            prefix_parse_funcs: HashMap::new(),
            infix_parse_funcs: HashMap::new(),
            postfix_parse_funcs: HashMap::new(),
        };
        // Register all of our prefix parse funcs
        parser.register_prefix(TokenType::IDENTIFIER, parse_identifier);
        parser.register_prefix(TokenType::INTEGER, parse_integer_literal);
        parser.register_prefix(TokenType::BANG, parse_prefix_expr);
        parser.register_prefix(TokenType::MINUS, parse_prefix_expr);
        parser.register_prefix(TokenType::TRUE, parse_boolean);
        parser.register_prefix(TokenType::FALSE, parse_boolean);
        parser.register_prefix(TokenType::LEFT_PAREN, parse_grouped_expr);
        parser.register_prefix(TokenType::IF, parse_if_expr);
        parser.register_prefix(TokenType::FUNCTION, parse_function_literal);
        parser.register_prefix(TokenType::STRING, parse_string_literal);
        parser.register_prefix(TokenType::LEFT_BRACKET, parse_array_literal);
        parser.register_prefix(TokenType::LEFT_BRACE, parse_hash_literal);
        // Register all of our infix parse funcs
        parser.register_infix(TokenType::PLUS, parse_infix_expr);
        // p.registerInfix(token.Minus, p.parseInfixExpression)
        // p.registerInfix(token.Slash, p.parseInfixExpression)
        // p.registerInfix(token.Star, p.parseInfixExpression)
        // p.registerInfix(token.Mod, p.parseInfixExpression)
        // p.registerInfix(token.EqualEqual, p.parseInfixExpression)
        // p.registerInfix(token.BangEqual, p.parseInfixExpression)
        // p.registerInfix(token.Less, p.parseInfixExpression)
        // p.registerInfix(token.Greater, p.parseInfixExpression)
        // p.registerInfix(token.LessEqual, p.parseInfixExpression)
        // p.registerInfix(token.GreaterEqual, p.parseInfixExpression)
        // p.registerInfix(token.LeftParen, p.parseCallExpression)
        // p.registerInfix(token.LeftBracket, p.parseIndexExpr)
        // p.registerInfix(token.And, p.parseInfixExpression)
        // p.registerInfix(token.Or, p.parseInfixExpression)
        parser
    }
pub fn new ( lexer : Lexer ) -> Parser { let mut parser = Parser { lexer , errors : vec ! [ ] , current_token : Token { line : 0 , literal : " " . to_owned ( ) , token_type : TokenType :: NONE , } , peek_token : Token { line : 0 , literal : " " . to_owned ( ) , token_type : TokenType :: NONE , } , prev_token : Token { line : 0 , literal : " " . to_owned ( ) , token_type : TokenType :: NONE , } , prefix_parse_funcs : HashMap :: new ( ) , infix_parse_funcs : HashMap :: new ( ) , postfix_parse_funcs : HashMap :: new ( ) , } ; // Register all of our prefix parse funcs parser . register_prefix ( TokenType :: IDENTIFIER , parse_identifier ) ; parser . register_prefix ( TokenType :: INTEGER , parse_integer_literal ) ; parser . register_prefix ( TokenType :: BANG , parse_prefix_expr ) ; parser . register_prefix ( TokenType :: MINUS , parse_prefix_expr ) ; parser . register_prefix ( TokenType :: TRUE , parse_boolean ) ; parser . register_prefix ( TokenType :: FALSE , parse_boolean ) ; parser . register_prefix ( TokenType :: LEFT_PAREN , parse_grouped_expr ) ; parser . register_prefix ( TokenType :: IF , parse_if_expr ) ; parser . register_prefix ( TokenType :: FUNCTION , parse_function_literal ) ; parser . register_prefix ( TokenType :: STRING , parse_string_literal ) ; parser . register_prefix ( TokenType :: LEFT_BRACKET , parse_array_literal ) ; parser . register_prefix ( TokenType :: LEFT_BRACE , parse_hash_literal ) ; // Register all of our infix parse funcs parser . register_infix ( TokenType :: PLUS , parse_infix_expr ) ; // p.registerInfix(token.Minus, p.parseInfixExpression) // p.registerInfix(token.Slash, p.parseInfixExpression) // p.registerInfix(token.Star, p.parseInfixExpression) // p.registerInfix(token.Mod, p.parseInfixExpression) // p.registerInfix(token.EqualEqual, p.parseInfixExpression) // p.registerInfix(token.BangEqual, p.parseInfixExpression) // p.registerInfix(token.Less, p.parseInfixExpression) // p.registerInfix(token.Greater, p.parseInfixExpression) // p.registerInfix(token.LessEqual, p.parseInfixExpression) // p.registerInfix(token.GreaterEqual, p.parseInfixExpression) // p.registerInfix(token.LeftParen, p.parseCallExpression) // p.registerInfix(token.LeftBracket, p.parseIndexExpr) // p.registerInfix(token.And, p.parseInfixExpression) // p.registerInfix(token.Or, p.parseInfixExpression) parser }
New takes a Lexer, creates a Parser with that Lexer, sets the
current and peek tokens, and returns the Parser.
New takes a Lexer creates a Parser with that Lexer sets the current and peek tokens and returns the Parser .
lexer
Lexer
lexer
Lexer