public void scanVariable() {
        final char first = ch;

        if (ch != '@' && ch != ':') {
            throw new ELException("illegal variable");
        }

        int hash = first;

        np = bp;
        sp = 1;
        char ch;
        if (buf[bp + 1] == '@') {
            hash = 31 * hash + '@';
            bp++;
            sp++;
        }
        for (;;) {
            ch = buf[++bp];

            if (!isIdentifierChar(ch)) {
                break;
            }

            hash = 31 * hash + ch;

            sp++;
            continue;
        }

        this.ch = buf[bp];

        stringVal = symbolTable.addSymbol(buf, np, sp, hash);
        TinyELToken tok = keywods.getKeyword(stringVal);
        if (tok != null) {
            token = tok;
        } else {
            token = TinyELToken.IDENTIFIER;
        }
    }