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); }
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); }
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); }