Ejemplo n.º 1
0
 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);
 }
Ejemplo n.º 2
0
 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()));
     }
 }