private final void parseDispatchTable(ParseUtil.IndentableLexer lexer) throws IOException,
            RuntimeException {
        lexer.skipSpaces();
        lexer.pass('(');
        lexer.skipSpaces();
        dispatchSuboffset = lexer.readUnsignedInteger("dispatch suboffset");
        lexer.skipSpaces();
        lexer.pass(')');
        lexer.passLogicalNewline();
        lexer.passIndent();
        while (!lexer.atDedent()) {
            lexer.noIndent();
            lexer.pass('[');
            lexer.skipSpaces();
            int posBeforeSet = lexer.getPos();
            CodeSet set = CodeSet.parse(lexer);
            lexer.skipSpaces();
            lexer.pass(']');
            lexer.skipSpaces();
            for (int i = 0; i < 256; i++) {
                if (set.matches(i)) {
                    if (dispatchTable[i] != -1) {
                        lexer.errorAtPos(posBeforeSet, "duplicate decipherer for 0x" + Hex.b(i));
                    }
                    dispatchTable[i] = coll.currentPosition();
                }
            }
            while (!lexer.atEndOfLine()) {
                int posBeforeChar = lexer.getPos();
                char c = lexer.readChar();
                if (c == '<') {
                    parseBroketed(lexer);
                } else {
                    if (c < 0x20 || c > 0x7E) {
                        lexer.errorAtPos(posBeforeChar, "invalid literal character code 0x" + Hex.w(c));
                    }
                    coll.add((byte) c);
                }
            }
            coll.add(ClassicLang.Bytecode.COMPLETE);
            lexer.passLogicalNewline();
        }
        lexer.discardDedent();
    }