📄 lispreader.java
字号:
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 + -