public static void ParseGlobal(CowList<Token> tokens, TextWithChanges text, out ParseTree parseTree, out CowList<Token> remainingTokens) { CowList<ParseTree> trees = new CowList<ParseTree>(); remainingTokens = tokens; while (remainingTokens.Count > 0) { ParseTree tree; ParseLocal(remainingTokens, text, out tree, out remainingTokens); trees.Add(tree); } if (trees.Count == 0) { throw new ParseException("No tokens in stream."); } parseTree = new ParseTreeList(tokens[0].StartPosition, trees.Last.EndPosition, trees, SexpParser.GetInstance(ParseType.Global), null, text); }
public static void ParseLocal(CowList<Token> tokens, TextWithChanges text, out ParseTree parseTree, out CowList<Token> remainingTokens) { if (tokens.Count == 0) { throw new ParseException("No tokens in stream."); } switch ((TokenTypes)tokens[0].Kind) { case TokenTypes.Quote: ParseTree quotedTree; ParseLocal(tokens.Tail, text, out quotedTree, out remainingTokens); parseTree = new ParseTreeQuote(tokens[0].StartPosition, quotedTree.EndPosition, quotedTree, SexpParser.GetInstance(ParseType.Sexp), null, text); return; case TokenTypes.OpenParen: CowList<ParseTree> members = new CowList<ParseTree>(); CowList<Token> iterTokens = tokens.Tail; while (iterTokens.Count > 0 && (TokenTypes)iterTokens[0].Kind != TokenTypes.CloseParen) { ParseTree member; CowList<Token> nextIterTokens; ParseLocal(iterTokens, text, out member, out nextIterTokens); iterTokens = nextIterTokens; members.Add(member); } if (iterTokens.Count == 0) { throw new ParseException("No tokens left in stream, expected a ')'."); } remainingTokens = iterTokens.Tail; parseTree = new ParseTreeList(tokens[0].StartPosition, iterTokens[0].EndPosition, members, SexpParser.GetInstance(ParseType.Sexp), null, text); return; case TokenTypes.CloseParen: throw new ParseException("Unexpected ')'."); case TokenTypes.Atom: remainingTokens = tokens.Tail; parseTree = new ParseTreeAtom(tokens[0].StartPosition, tokens[0].EndPosition, tokens[0].Content, SexpParser.GetInstance(ParseType.Sexp), null, text); return; default: throw new ParseException(String.Format("Unknown token '{0}'.", tokens[0].ToString())); } }