internal 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 Exception("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 Exception("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); }
internal Object doRead(LocTextReader t, Boolean firstInForm) { Int32 ch = t.Read(); while (Char.IsWhiteSpace((Char)ch)) { ch = t.Read(); } if (ch == -1) { //return null; //return Symbol.EOF; return(EOF_MARKER); } if (ch == '#') { eatMultiComment(t); return(doRead(t, firstInForm)); } if (ch == ';') { eatComment(t); return(doRead(t, firstInForm)); } ReaderMacro rm = (ReaderMacro)macroTable[(Char)ch]; if (rm != null) { return(rm.func(t, (Char)ch)); } else { return(readSymbolOrNumber(t, ch, firstInForm)); } }
internal void eatMultiComment(LocTextReader t) { Int32 ch = t.Peek(); while (ch != -1 && ch != '#') { t.Read(); ch = t.Peek(); } if (ch == '#') { t.Read(); } }
internal 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(); } }
internal 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)); }
internal void eatComment(LocTextReader t) { Int32 ch = t.Peek(); while (ch != -1 && ch != '\n' && ch != '\r') { t.Read(); ch = t.Peek(); } // MEH: Why? Should never be true, or while would loop. //if(ch != -1 && ch != '\n' && ch != '\r') // t.Read(); // MEH: Guessing this was the intention: while (ch == '\n' || ch == '\r') { t.Read(); ch = t.Peek(); } }
internal Object ReadUnquote(params Object[] args) { LocTextReader t = (LocTextReader)args[0]; Int32 line = t.line; Int32 ch = t.Peek(); Object ret = null; if (ch == '@') { t.Read(); ret = Cons.MakeList(interpreter.UNQUOTE_SPLICING, doRead(t, false)); } else { ret = Cons.MakeList(interpreter.UNQUOTE, doRead(t, false)); } //record the location locTable[ret] = new Loc(t.file, line); return(ret); }
internal Object doRead(LocTextReader t, Boolean firstInForm) { //MEH: Converted the following from a while loop, and avoid checked build issues with ((Char)-1). Int32 ch; // = t.Read(); do { ch = t.Read(); if (ch == -1) { //return null; //return Symbol.EOF; return(EOF_MARKER); } }while(Char.IsWhiteSpace((Char)ch)); if (ch == '#') { eatMultiComment(t); return(doRead(t, firstInForm)); } if (ch == ';') { eatComment(t); return(doRead(t, firstInForm)); } ReaderMacro rm = (ReaderMacro)macroTable[(Char)ch]; if (rm != null) { return(rm.func(t, (Char)ch)); } else { return(readSymbolOrNumber(t, ch, firstInForm)); } }
internal Object ReadString(params Object[] args) { StringBuilder b = new StringBuilder(); LocTextReader t = (LocTextReader)args[0]; Int32 line = t.line; //eat the double-quote //t.Read(); //Int32 ch = t.Peek(); Int32 ch = t.Read(); while (ch != '"') { if (ch == -1) { throw new Exception("Read error - eof found before matching: \"" + "\n File: " + t.file + ", line: " + t.line); } //eat it //t.Read(); if (ch == '\\') //escape { ch = t.Read(); if (ch == -1) { throw new Exception("Read error - eof found before matching: \"" + "\n File: " + t.file + ", line: " + t.line); } switch (ch) { case 't': ch = '\t'; break; case 'r': ch = '\r'; break; case 'n': ch = '\n'; break; case '\\': break; case '"': break; default: throw new Exception("Unsupported escape character: \\" + (Char)ch + "\n File: " + t.file + ", line: " + t.line); } } b.Append((Char)ch); //ch = t.Peek(); ch = t.Read(); } //eat the trailing quote //t.Read(); Object ret = b.ToString(); //record the location locTable[ret] = new Loc(t.file, line); return(ret); }
internal 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); }
internal 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 Exception("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 Exception("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; }
internal void eatMultiComment(LocTextReader t) { Int32 ch = t.Peek(); while(ch != -1 && ch != '#') { t.Read(); ch = t.Peek(); } if(ch == '#') t.Read(); }
internal 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(); }
internal Object doRead(LocTextReader t,Boolean firstInForm) { Int32 ch = t.Read(); while(Char.IsWhiteSpace((Char)ch)) { ch = t.Read(); } if(ch == -1) { //return null; //return Symbol.EOF; return EOF_MARKER; } if(ch == '#') { eatMultiComment(t); return doRead(t,firstInForm); } if(ch == ';') { eatComment(t); return doRead(t,firstInForm); } ReaderMacro rm = (ReaderMacro)macroTable[(Char)ch]; if(rm != null) { return rm.func(t,(Char)ch); } else { return readSymbolOrNumber(t,ch,firstInForm); } }
internal void eatComment(LocTextReader t) { Int32 ch = t.Peek(); while(ch != -1 && ch != '\n' && ch != '\r') { t.Read(); ch = t.Peek(); } // MEH: Why? Should never be true, or while would loop. //if(ch != -1 && ch != '\n' && ch != '\r') // t.Read(); // MEH: Guessing this was the intention: while(ch == '\n' || ch == '\r') { t.Read(); ch = t.Peek(); } }
internal Object doRead(LocTextReader t,Boolean firstInForm) { //MEH: Converted the following from a while loop, and avoid checked build issues with ((Char)-1). Int32 ch;// = t.Read(); do { ch = t.Read(); if(ch == -1) { //return null; //return Symbol.EOF; return EOF_MARKER; } } while(Char.IsWhiteSpace((Char)ch)); if(ch == '#') { eatMultiComment(t); return doRead(t,firstInForm); } if(ch == ';') { eatComment(t); return doRead(t,firstInForm); } ReaderMacro rm = (ReaderMacro)macroTable[(Char)ch]; if(rm != null) { return rm.func(t,(Char)ch); } else { return readSymbolOrNumber(t,ch,firstInForm); } }