⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lispreader.java

📁 A framework written in Java for implementing high-level and dynamic languages, compiling them into J
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
	  readCase = 'D';	else if (upperCount == 0)	  readCase = 'U';	else	  readCase = 'P';      }    int packageMarker = -1;    int j = startPos;    for (int i = startPos;  i < endPos;  i++)      {	char ch = tokenBuffer[i];	if (ch == TOKEN_ESCAPE_CHAR)	  {	    if (++ i < endPos)	      tokenBuffer[j++] = tokenBuffer[i];	    continue;	  }	if (ch == ':')	  packageMarker = packageMarker >= 0 ? -1 : j;	else if (readCase == 'U')	  ch = Character.toUpperCase(ch);	else if (readCase == 'D')	  ch = Character.toLowerCase(ch);	tokenBuffer[j++] = ch;      }    endPos = j;    int len = endPos - startPos;    if (initialColonIsKeyword && packageMarker == startPos && len > 1)      {	startPos++;	String str = new String(tokenBuffer, startPos, endPos-startPos);	return Keyword.make(str.intern());    }    if (finalColonIsKeyword && packageMarker == endPos - 1 && len > 1)      {	String str = new String(tokenBuffer, startPos, len - 1);	return Keyword.make(str.intern());      }    return rtable.makeSymbol(new String(tokenBuffer, startPos, len));  }  /** Classify and return a token in tokenBuffer from startPos to endPos. */  public Object handleToken(int startPos, int endPos,  ReadTable rtable)  {    Object value = parseNumber(tokenBuffer, startPos, endPos - startPos,			       '\0', 0, SCM_NUMBERS);    if (value != null && ! (value instanceof String))      return value;    if (isPotentialNumber(tokenBuffer, startPos, endPos))      {	error(value == null ? "not a valid number"	      : "not a valid number: " + value);	return IntNum.zero();      }    return returnSymbol(startPos, endPos, rtable);  }  /** Reads a C-style String escape sequence.   * Assume '\\' has already been read.   * Return the converted character, or -1 on EOF, or -2 to ignore. */  public int readEscape()    throws java.io.IOException, SyntaxException   {    int c = read();    if (c < 0)      {	eofError("unexpected EOF in character literal");	return -1;      }    return readEscape(c);  }  public final int readEscape(int c)    throws java.io.IOException, SyntaxException   {    switch ((char) c)      {      case 'a':  c =  7;  break;  // alarm/bell      case 'b':  c =  8;  break;  // backspace      case 't':  c =  9;  break;  // tab      case 'n':  c = 10;  break;  // newline      case 'v':  c = 11;  break;  // vertical tab      case 'f':  c = 12;  break;  // formfeed      case 'r':  c = 13;  break;  // carriage return      case 'e':  c = 27;  break;  // escape      case '\"': c = 34;  break;  // quote      case '\\': c = 92;  break;  // backslash      case ' ': // Skip to end of line, inclusive.	for (;;)	  {	    c = read();	    if (c < 0)	      {		eofError("unexpected EOF in character literal");		return -1;	      }	    if (c == '\n')	      return -2;	    if (c == '\r')	      {		if (peek() == '\n')		  skip();		return -2;	      }	    if (c != ' ' && c != '\t')	      {		unread(c);		break;	      }	  }      case '\r':	if (peek() == '\n')	  skip();	return -2;      case '\n':	return -2;      case 'M':	c = read();	if (c != '-')	  {	    error("Invalid escape character syntax");	    return '?';	  }	c = read();	if (c == '\\')	  c = readEscape();	return c | 0200;      case 'C':	c = read();	if (c != '-')	  {	    error("Invalid escape character syntax");	    return '?';	  }	/* ... fall through ... */      case '^':	c = read();	if (c == '\\')	  c = readEscape();	if (c == '?')	  return 0177;	return c & (0200 | 037);      case '0':      case '1':      case '2':      case '3':      case '4':      case '5':      case '6':      case '7':	/* An octal escape, as in ANSI C.  */	c = c - '0';	for (int count = 0;  ++count < 3; )	  {	    int d = read();	    int v = Character.digit((char) d, 8);	    if (v >= 0)	      c = (c << 3) + v;	    else	      {		if (d >= 0)		  unread(d);		break;	      }	  }	break;      case 'u':	c = 0;	for (int i = 4;  --i >= 0; )	  {	    int d = read ();	    if (d < 0)	      eofError("premature EOF in \\u escape");	    int v = Character.digit ((char) d, 16);	    if (v < 0)	      error("non-hex character following \\u");	    c = 16 * c + v;	  }	break;      case 'x':	c = 0;	/* A hex escape, as in ANSI C.  */	for (;;)	  {	    int d = read();	    int v = Character.digit((char) d, 16);	    if (v >= 0)	      c = (c << 4) + v;	    else	      {		if (d >= 0)		  unread(d);		break;	      }	  }	break;      default:  break;      }    return c;  }  public final Object readObject (int c)      throws java.io.IOException, SyntaxException  {    unread(c);    return readObject();  }  /** Read a "command" - a top-level expression or declaration.   * Return Sequence.eofValue of end of file. */  public Object readCommand ()      throws java.io.IOException, SyntaxException  {    return readObject();  }  protected Object makeNil ()  {    return LList.Empty;  }  protected Object makePair (Object car, int line, int column)  {    String pname = port.getName();    if (pname != null && line >= 0)      return PairWithPosition.make(car, LList.Empty,                                   pname, line + 1, column + 1);    else      return Pair.make(car, LList.Empty);  }  public Object makePair (Object car, Object cdr)  {    Object pair = makePair(car, -1, -1);    setCdr(pair, cdr);    return pair;  }  protected void setCdr (Object pair, Object cdr)  {    ((Pair) pair).cdr = cdr;  }  /** Read a number from a LispReader   * @param previous number of characters already pushed on tokenBuffer   * @param reader LispReader to read from   * @param radix base to use or -1 if unspecified   */  public static Object readNumberWithRadix(int previous, LispReader reader, int radix)    throws java.io.IOException, SyntaxException  {    int startPos = reader.tokenBufferLength - previous;    reader.readToken(reader.read(), 'P', ReadTable.getCurrent());    int endPos = reader.tokenBufferLength;    if (startPos == endPos)      {	reader.error("missing numeric token");	return IntNum.zero();      }    Object result = LispReader.parseNumber(reader.tokenBuffer, startPos,					   endPos - startPos, '\0', radix, 0);    if (result instanceof String)      {	reader.error((String) result);	return IntNum.zero();      }    else if (result == null)      {	reader.error("invalid numeric constant");	return IntNum.zero();      }    else      return result;  }  public static Object readCharacter (LispReader reader)    throws java.io.IOException, SyntaxException  {    int ch = reader.read();    if (ch < 0)      reader.eofError("unexpected EOF in character literal");    int startPos = reader.tokenBufferLength;    reader.tokenBufferAppend(ch);    reader.readToken(reader.read(), 'D', ReadTable.getCurrent());    int length = reader.tokenBufferLength - startPos;    if (length == 1)      return Char.make(reader.tokenBuffer[startPos]);    String name = new String(reader.tokenBuffer, startPos, length);    ch = Char.nameToChar(name);    if (ch >= 0)      return Char.make(ch);    ch = Character.digit(reader.tokenBuffer[startPos], 8);    if (ch >= 0)      {	int value = ch;	for (int i = 1;  ;  i++)	  {	    if (i == length)	      return Char.make(value);	    ch = Character.digit(reader.tokenBuffer[startPos + i], 8);	    if (ch < 0)	      break;	    value = 8 * value + ch;	  }      }    reader.error("unknown character name: " + name);    return Char.make('?');  }  public static Object readSpecial (LispReader reader)    throws java.io.IOException, SyntaxException  {    int ch = reader.read();    if (ch < 0)      reader.eofError("unexpected EOF in #! special form");    /* Handle Unix #!PROGRAM line at start of file. */    if (ch == '/'	&& reader.getLineNumber() == 0	&& reader.getColumnNumber() == 3)      {	ReaderIgnoreRestOfLine.getInstance().read(reader, '#', 1);	return Values.empty;      }    int startPos = reader.tokenBufferLength;    reader.tokenBufferAppend(ch);    reader.readToken(reader.read(), 'D', ReadTable.getCurrent());    int length = reader.tokenBufferLength - startPos;    String name = new String(reader.tokenBuffer, startPos, length);    if (name.equals("optional"))      return Special.optional;    if (name.equals("rest"))      return Special.rest;    if (name.equals("key"))      return Special.key;    if (name.equals("eof"))      return Special.eof;    if (name.equals("void"))      //return Values.empty;      return QuoteExp.voidExp;    if (name.equals("default"))      return Special.dfault;    if (name.equals("undefined"))      return Special.undefined;    if (name.equals("null"))      return null;    reader.error("unknown named constant #!"+name);    return null;  }  public static SimpleVector  readSimpleVector(LispReader reader, char kind)    throws java.io.IOException, SyntaxException  {    int size = 0;    int ch;    for (;;)      {	ch = reader.read();	if (ch < 0)	  reader.eofError("unexpected EOF reading uniform vector");	int digit = Character.digit((char) ch, 10);	if (digit < 0)	  break;	size = size * 10 + digit;      }    if (! (size == 8 || size == 16 || size == 32 || size == 64)        || (kind == 'F' && size < 32)        || ch != '(')      {        reader.error("invalid uniform vector syntax");        return null;      }    Object list = ReaderParens.readList(reader, '(', -1, ')');    int len = LList.listLength(list, false);    if (len < 0)      {        reader.error("invalid elements in uniform vector syntax");        return null;      }    Sequence q = (Sequence) list;    switch (kind)      {      case 'F':        switch (size)          {          case 32:  return new F32Vector(q);          case 64:  return new F64Vector(q);          }      case 'S':        switch (size)          {          case  8:  return new S8Vector(q);          case 16:  return new S16Vector(q);          case 32:  return new S32Vector(q);          case 64:  return new S64Vector(q);          }      case 'U':        switch (size)          {          case  8:  return new U8Vector(q);          case 16:  return new U16Vector(q);          case 32:  return new U32Vector(q);          case 64:  return new U64Vector(q);          }      }    return null;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -