public LabelStatement(SourceFile sourceFile, int lineNo, Token[] tokens) throws SyntaxError {
        // Super-class (Statement) constructor
        super(sourceFile, lineNo, tokens);
        
        // First token must be a label
        if(tokens[0].is(TokenType.LABEL)){
            addressJump = false;
        }else if(tokens[0].is(TokenType.LABEL2)) {
            addressJump = true;
        }else {
            throwSyntaxError(0, "Not a Label definition");
        }
        
        // Get the tokens for the statement the label points to
        Token[] statementTokens = Arrays.copyOfRange(tokens, 1, tokens.length);
        
        /* Try to construct the sub-statement based upon the type of Token
         * at the start of the statementTokens e.g. OpCode token -> OpCodeStatment 
         * Any syntax errors thrown will be  re-thrown and so this
         * LabelStatement will fail to construct */
        switch(statementTokens[0].getType()) {
            case OPCODE :
                statement = new OpCodeStatement(sourceFile, lineNo, statementTokens);
                break;
            case WORD :
                statement = new MacroCallStatement(sourceFile, lineNo, statementTokens);
                break;
            case DATA :
                statement = new DataStatement(sourceFile, lineNo, statementTokens);
                break;
            case STRING :
                statement = new StringStatement(sourceFile, lineNo, statementTokens);
                break;
            case INSTRUCTION :
                statement = new Instruction(sourceFile, lineNo, statementTokens);
                break;
            case EOL :
                statement = null;
                break;
            default :
                // Labels can only point to OpCode, MacroCall, string or Data statements
                throwSyntaxError(1, "Expected opcode, data, string or EOL");
        }
    }