示例#1
0
    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 + "'");
            }

        }
    }
示例#2
0
    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 + "'");
            }

        }
    }