// This code is pretty hairy - the problem is // distinguishing between: // 1. a floating point number, which may be // in scientific notification, and might simply begin // with "." // 2. A symbol with a dot in it // 3. Just a lone "." used for separating lists // It's doubtful that it's entirely correct - but if you find a bug, // add it as a test to ScannerTest and amend this logic. private static TokenType?matchNumber(Scanner s) { if (s.peek() == '.') { return(leadingFloat(s)); } if (s.isOneOf("+-")) { s.readChar(); if (s.peek() == '.') { return(leadingFloat(s)); } var num = unsignedNumber(s); if (num != null) { return(num); } matchSymbol(s); return(TokenType.Symbol); } return(unsignedNumber(s)); }
// TODO: // WE should implement actual reader macros for this part of things. private static TokenType?matchHash(Scanner s) { if (s.peek() != '#') { return(null); } s.readChar(); if (s.peek() == '(') { s.readChar(); return(TokenType.VectorOpen); } if (s.isOneOf("tfTF")) { s.readChar(); return(TokenType.Boolean); } throw s.fail("Unrecognized token"); }
private static TokenType?readExponent(Scanner s) { s.readChar(); // Skip exponent market var read = false; if (s.isOneOf("+-")) { s.readChar(); read = true; } while (s.isDigit()) { read = true; s.readChar(); } if (read) { return(TokenType.Double); } // It's not a floating point number in exponent format. // Read it as a symbol instead. matchSymbol(s); return(TokenType.Symbol); }
// TODO: // WE should implement actual reader macros for this part of things. private static TokenType? matchHash(Scanner s) { if (s.peek() != '#') return null; s.readChar(); if(s.peek() == '(') { s.readChar(); return TokenType.VectorOpen; } if(s.isOneOf("tfTF")) { s.readChar(); return TokenType.Boolean; } throw s.fail("Unrecognized token"); }
// This code is pretty hairy - the problem is // distinguishing between: // 1. a floating point number, which may be // in scientific notification, and might simply begin // with "." // 2. A symbol with a dot in it // 3. Just a lone "." used for separating lists // It's doubtful that it's entirely correct - but if you find a bug, // add it as a test to ScannerTest and amend this logic. private static TokenType? matchNumber(Scanner s) { if(s.peek() == '.') return leadingFloat(s); if(s.isOneOf("+-")) { s.readChar(); if(s.peek() == '.') return leadingFloat(s); var num = unsignedNumber(s); if (num != null) return num; matchSymbol(s); return TokenType.Symbol; } return unsignedNumber(s); }
private static TokenType? readExponent(Scanner s) { s.readChar(); // Skip exponent market var read = false; if (s.isOneOf("+-")) { s.readChar(); read = true; } while (s.isDigit()) { read = true; s.readChar(); } if(read) return TokenType.Double; // It's not a floating point number in exponent format. // Read it as a symbol instead. matchSymbol(s); return TokenType.Symbol; }