public AST Parse(IEnumerable <string> tokens)
        {
            _lexer = new Lexer(tokens);

            if (_lexer.CurrentToken.Type == TokenType.EOF)
            {
                return(null);
            }

            var tree = _lexer.CurrentToken.Value.ToLower() == "fn" ? ParseFnDef() : ParseExpr();

            _lexer.AcceptToken(TokenType.EOF);
            return(tree);
        }
        private AST ParseFnDef()
        {
            _lexer.AcceptToken(TokenType.Identifier);
            var fName = _lexer.CurrentToken.Value;

            _lexer.AcceptToken(TokenType.Identifier);

            var formalParams = new List <string>();

            while (_lexer.CurrentToken.Type == TokenType.Identifier)
            {
                formalParams.Add(_lexer.CurrentToken.Value);
                _lexer.AcceptToken(TokenType.Identifier);
            }

            _lexer.AcceptToken(TokenType.FnBodyDef);

            var body  = ParseExpr(formalParams);
            var fnDef = new FnDefAST(fName, formalParams, body);

            Context.AddDef(fName, fnDef);
            return(fnDef);
        }