Пример #1
0
 protected Object ReadSymbolOrNumber(LocTextReader t, Int32 ch, Boolean firstInForm)
 {
     StringBuilder b = new StringBuilder();
     b.Append((Char)ch);
     Boolean complete = false;
     while (!complete) {
         ch = t.Peek();
         if (ch == -1)
             complete = true;
         else if (Char.IsWhiteSpace((Char)ch))
             complete = true;
         else {
             ReaderMacro rm = (ReaderMacro)MacroTable[(Char)ch];
             if (rm != null && rm.IsTerminating)
                 complete = true;
             else {
                 t.Read();
                 b.Append((Char)ch);
             }
         }
     }
     return ParseSymbolOrNumber(b.ToString(), firstInForm);
 }
Пример #2
0
 protected void EatMultiComment(LocTextReader t)
 {
     Int32 ch = t.Peek();
     while (ch != -1 && ch != '#') {
         t.Read();
         ch = t.Peek();
     }
     if (ch == '#')
         t.Read();
 }
Пример #3
0
        protected Cons ReadDelimitedList(LocTextReader t, Int32 delim)
        {
            Cons ret = null;
            Cons tail = null;

            Int32 ch = t.Peek();
            while (Char.IsWhiteSpace((Char)ch)) {
                t.Read();
                ch = t.Peek();
            }
            while (ch != delim) {
                Object o = DoRead(t, delim == ')' && ret == null);
                if (Eof(o)) {
                    throw new LispException("Read error - eof found before matching: "
                                              + (Char)delim + "\n File: " + t.File + ", line: " + t.Line);
                }
                EndDelimiter ed = o as EndDelimiter;
                if (ed != null) {
                    if (ed.Delim == delim) {
                        return ret;
                    } else
                        throw new LispException("Read error - read unmatched: " + ed.Delim
                                                  + "\n File: " + t.File + ", line: " + t.Line);
                }
                Cons link = new Cons(o, null);
                if (delim == ')' && ret == null && o is CompositeSymbol) {
                    ret = ((CompositeSymbol)o).SymbolAsList;
                    tail = ret.Rest;
                } else if (ret == null) {
                    ret = tail = link;
                } else {
                    tail.Rest = link;
                    tail = link;
                }
                ch = t.Peek();
                while (Char.IsWhiteSpace((Char)ch)) {
                    t.Read();
                    ch = t.Peek();
                }
            }

            //eat delim
            t.Read();
            return ret;
        }
Пример #4
0
 protected void EatComment(LocTextReader t)
 {
     Int32 ch = t.Peek();
     while (ch != -1 && ch != '\n' && ch != '\r') {
         t.Read();
         ch = t.Peek();
     }
     if (ch != -1 && ch != '\n' && ch != '\r')
         t.Read();
 }