private void Scan(IO.TextReader input) { while (input.Peek() != -1) { char ch = (char)input.Peek(); // Scan individual tokens if (char.IsWhiteSpace(ch)) { // eat the current char and skip ahead! input.Read(); } else if (char.IsLetter(ch) || ch == '_') { // keyword or identifier Text.StringBuilder accum = new Text.StringBuilder(); while (char.IsLetter(ch) || ch == '_') { accum.Append(ch); input.Read(); if (input.Peek() == -1) { break; } else { ch = (char)input.Peek(); } } this.result.Add(accum.ToString()); } else if (ch == '"') { // string literal Text.StringBuilder accum = new Text.StringBuilder(); input.Read(); // skip the '"' if (input.Peek() == -1) { throw new System.Exception("unterminated string literal"); } while ((ch = (char)input.Peek()) != '"') { accum.Append(ch); input.Read(); if (input.Peek() == -1) { throw new System.Exception("unterminated string literal"); } } // skip the terminating " input.Read(); this.result.Add(accum); } else if (char.IsDigit(ch)) { // numeric literal Text.StringBuilder accum = new Text.StringBuilder(); while (char.IsDigit(ch)) { accum.Append(ch); input.Read(); if (input.Peek() == -1) { break; } else { ch = (char)input.Peek(); } } this.result.Add(int.Parse(accum.ToString())); } else switch (ch) { case '+': input.Read(); this.result.Add(Scanner.Add); break; case '-': input.Read(); this.result.Add(Scanner.Sub); break; case '*': input.Read(); this.result.Add(Scanner.Mul); break; case '/': input.Read(); this.result.Add(Scanner.Div); break; case '=': input.Read(); this.result.Add(Scanner.Equal); break; case ';': input.Read(); this.result.Add(Scanner.Semi); break; default: throw new System.Exception("Scanner encountered unrecognized character '" + ch + "'"); } } }
private void Scan(IO.TextReader input) { while (input.Peek() != -1) { char caracter = (char)input.Peek(); // Scan individual tokens if (char.IsWhiteSpace(caracter)) { // eat the current char and skip ahead! input.Read(); } else if (char.IsLetter(caracter) || caracter == '_') { // keyword or identifier Text.StringBuilder accum = new Text.StringBuilder(); while (char.IsLetter(caracter) || caracter == '_') { accum.Append(caracter); input.Read(); if (input.Peek() == -1) { break; } else { caracter = (char)input.Peek(); } } this.resultado.Add(accum.ToString()); } else if (caracter == '"') { // string literal Text.StringBuilder accum = new Text.StringBuilder(); input.Read(); // skip the '"' if (input.Peek() == -1) { throw new System.Exception("Cadena sin terminar"); } while ((caracter = (char)input.Peek()) != '"') { accum.Append(caracter); input.Read(); if (input.Peek() == -1) { throw new System.Exception("Cadena sin terminar"); } } // skip the terminating " input.Read(); this.resultado.Add(accum); } else if (char.IsDigit(caracter)) { // numeric literal Text.StringBuilder accum = new Text.StringBuilder(); while (char.IsDigit(caracter)) { accum.Append(caracter); input.Read(); if (input.Peek() == -1) { break; } else { caracter = (char)input.Peek(); } } this.resultado.Add(int.Parse(accum.ToString())); } else switch (caracter) { case '+': input.Read(); this.resultado.Add(Scanner.Sum); break; case '-': input.Read(); this.resultado.Add(Scanner.Res); break; case '*': input.Read(); this.resultado.Add(Scanner.Mul); break; case '/': input.Read(); this.resultado.Add(Scanner.Div); break; case '=': input.Read(); if (input.Peek() == '=') { input.Read(); this.resultado.Add(Scanner.Eq); } else this.resultado.Add(Scanner.Igual); break; case ';': input.Read(); this.resultado.Add(Scanner.PyC); break; case '>': input.Read(); if (input.Peek() == '=') { input.Read(); this.resultado.Add(Scanner.Gte); } else this.resultado.Add(Scanner.Gt); break; case '<': input.Read(); if (input.Peek() == '=') { input.Read(); this.resultado.Add(Scanner.Lte); } else this.resultado.Add(Scanner.Lt); break; case '!': input.Read(); if (input.Peek() == '=') { input.Read(); this.resultado.Add(Scanner.Neq); } else throw new System.Exception("No se reconoce el siguiente caracter: '" + caracter + "'"); break; default: throw new System.Exception("No se reconoce el siguiente caracter: '" + caracter + "'"); } } }