Пример #1
0
            public static Node.Names Parse()
            {
                Node.Names n;

                if (IsLookahead(1, Tokens.Identifier))
                {
                    Match(Tokens.Identifier);
                    Token identifier = Parser.Lexer.Current();

                    if (IsLookahead(1, Tokens.Operator, Lexemes.Comma))
                    {
                        Match(Tokens.Operator, Lexemes.Comma);
                    }

                    n = new Node.Names
                    {
                        Id = new Node.Identifier
                        {
                            id = (string)identifier.Attribute
                        },
                        N = Parser.Names.Parse()
                    };
                }
                else if (IsLookahead(1, Tokens.Operator, Lexemes.ParenClose))
                {
                    n = null;
                }
                else
                {
                    throw new Exceptions.Parser.UnexpectedLookahead("Parse(Names)", Lexer.Lookahead(1), 1);
                }

                return(n);
            }
Пример #2
0
        private Types.Object EvaluateClosure(Node.Function node)
        {
            List <string> parameters = new List <string>();

            for (Node.Names next = node.N; next != null; next = next.N)
            {
                parameters.Add(next.Id.id);
            }

            Types.Closure closure = new Types.Closure
            {
                Body        = node.E,
                Parameters  = parameters,
                Environment = new Env(this.Environment),
            };
            return(closure);
        }
Пример #3
0
            public static Node.Value Parse()
            {
                Node.Value n;

                if (IsLookahead(1, Tokens.Number))
                {
                    Match(Tokens.Number);

                    n = new Node.Number
                    {
                        n = (string)Parser.Lexer.Current().Attribute
                    };
                }
                else if (IsLookahead(1, Tokens.Identifier))
                {
                    Match(Tokens.Identifier);
                    Token identifier = Parser.Lexer.Current();

                    if (IsLookahead(1, Tokens.Operator, Lexemes.Dot) &&
                        IsLookahead(2, Tokens.Identifier, "reference"))
                    {
                        Match(Tokens.Operator, Lexemes.Dot);
                        Match(Tokens.Identifier);
                        n = new Node.Reference {
                            id = (string)identifier.Attribute
                        };
                    }
                    else
                    {
                        n = new Node.Identifier
                        {
                            id = (string)identifier.Attribute
                        }
                    };
                }
                else if (IsLookahead(1, Tokens.Keyword, Lexemes.Function))
                {
                    Match(Tokens.Keyword, Lexemes.Function);
                    Match(Tokens.Operator, Lexemes.ParenOpen);
                    Node.Names pl = Parser.Names.Parse();
                    Match(Tokens.Operator, Lexemes.ParenClose);
                    Node.Expression body = Parser.Expression.Parse();

                    n = new Node.Function
                    {
                        N = pl,
                        E = body
                    };
                }
                else if (IsLookahead(1, Tokens.Operator, Lexemes.BrackOpen))
                {
                    Match(Tokens.Operator, Lexemes.BrackOpen);

                    n = new Node.Wrapped
                    {
                        E = Parser.Expression.Parse()
                    };

                    Match(Tokens.Operator, Lexemes.BrackClose);
                }
                else if (IsLookahead(1, Tokens.Operator, Lexemes.BraceOpen))
                {
                    n = Parser.Block.Parse();
                }
                else if (IsLookahead(1, Tokens.Keyword, Lexemes.Undefined))
                {
                    Match(Tokens.Keyword, Lexemes.Undefined);
                    n = new Node.Undefined {
                    };
                }
                else
                {
                    throw new Exceptions.Parser.UnexpectedLookahead("Parse(Value)", Lexer.Lookahead(1), 1);
                }

                return(n);
            }