Beispiel #1
0
        public Token NextToken()
        {
            var tok = new Token();

            skipWhitespace();

            switch (ch)
            {
            case '=':
                if (peekChar() == '=')
                {
                    var ch = this.ch;
                    readChar();
                    tok = new Token(TokenType.EQUALS_EQUALS, $"{ch}{this.ch}");
                }
                else
                {
                    tok = makeToken(TokenType.EQUALS);
                }

                break;

            case '+':
                tok = makeToken(TokenType.PLUS);
                break;

            case ';':
                tok = makeToken(TokenType.SEMICOLON);
                break;

            case ',':
                tok = makeToken(TokenType.COMMA);
                break;

            case '(':
                tok = makeToken(TokenType.LPAREN);
                break;

            case ')':
                tok = makeToken(TokenType.RPAREN);
                break;

            case '{':
                tok = makeToken(TokenType.LBRACE);
                break;

            case '}':
                tok = makeToken(TokenType.RBRACE);
                break;

            case '!':
                if (peekChar() == '=')
                {
                    var ch = this.ch;
                    readChar();
                    tok = new Token(TokenType.BANG_EQUALS, $"{ch}{this.ch}");
                }
                else
                {
                    tok = makeToken(TokenType.BANG);
                }

                break;

            case '-':
                tok = makeToken(TokenType.MINUS);
                break;

            case '/':
                tok = makeToken(TokenType.SLASH);
                break;

            case '*':
                tok = makeToken(TokenType.ASTERISK);
                break;

            case '<':
                tok = makeToken(TokenType.LT);
                break;

            case '>':
                tok = makeToken(TokenType.GT);
                break;

            case '"':
                tok.Type    = TokenType.STRING;
                tok.Literal = readString();
                break;

            case '[':
                tok = makeToken(TokenType.LBRACKET);
                break;

            case ']':
                tok = makeToken(TokenType.RBRACKET);
                break;

            case ':':
                tok = makeToken(TokenType.COLON);
                break;

            case '\0':
                tok.Literal = "";
                tok.Type    = TokenType.EOF;
                break;

            default:
                if (ch.IsLetter())
                {
                    tok.Literal = readIdentifier();
                    tok.Type    = TokenFacts.LookupIdent(tok.Literal);
                    return(tok);
                }
                else if (ch.IsDigit())
                {
                    tok.Literal = readNumber();
                    tok.Type    = TokenType.INT;
                    return(tok);
                }
                else
                {
                    tok = makeToken(TokenType.ILLEGAL);
                }

                break;
            }

            readChar();
            return(tok);
        }