public static Node.Sequence Parse() { Node.Sequence n; if (IsLookahead(1, Tokens.Operator, Lexemes.BraceClose) || IsLookahead(1, Tokens.Operator, Lexemes.ParenClose)) { n = null; } else { Node.Expression e = Parser.Expression.Parse(); if (IsLookahead(1, Tokens.Operator, Lexemes.Comma)) { Match(Tokens.Operator, Lexemes.Comma); } n = new Node.Sequence { E = e, S = Parser.Sequence.Parse() }; } return(n); }
private Types.List EvaluateSequence(Node.Sequence node) { Types.List sequence = new Types.List(); Node.Sequence next = node; while (next != null) { sequence.AppendElement(Evaluate(next.E)); next = next.S; } return(sequence); }
public static Node.Continuation Parse() { Node.Continuation n; if (IsLookahead(1, Tokens.Operator, Lexemes.ParenOpen)) { Match(Tokens.Operator, Lexemes.ParenOpen); Node.Sequence sequence = Parser.Sequence.Parse(); Match(Tokens.Operator, Lexemes.ParenClose); n = new Node.Call { S = sequence, C = Parser.Continuation.Parse() }; } else if (IsLookahead(1, Tokens.Operator, Lexemes.Dot)) { Match(Tokens.Operator, Lexemes.Dot); Match(Tokens.Identifier); Token identifier = Parser.Lexer.Current(); n = new Node.Access { Id = new Node.Identifier { id = (string)identifier.Attribute }, C = Parser.Continuation.Parse() }; } else if (IsLookahead(1, Tokens.Operator, Lexemes.Assign)) { Match(Tokens.Operator, Lexemes.Assign); n = new Node.Assign { E = Parser.Expression.Parse() }; } else { n = null; } return(n); }